Simple overlay load.

This commit is contained in:
Krad
2022-09-15 11:04:21 +08:00
parent 19a6718665
commit 258b56b456
5 changed files with 68 additions and 3 deletions

View File

@@ -154,6 +154,17 @@ void DICOMPixelDataHelper::GetRGBPixelData(const char *path, void *data, unsigne
delete fileFormat;
}
int DICOMPixelDataHelper::GetOverLayCount(const char *path) {
int ret = 0;
DcmFileFormat fileFormat;
if (fileFormat.loadFile(path).good()) {
DcmDataset * dset = fileFormat.getDataset();
DicomImage dcmImage(&fileFormat, dset->getOriginalXfer(), CIF_MayDetachPixelData);
ret = dcmImage.getOverlayCount();
}
return ret;
}
void DICOMPixelDataHelper::GetOverlayData(const char *path, void *data,
unsigned int& width, unsigned int& height, unsigned int plane) {
DcmFileFormat *fileFormat = new DcmFileFormat();//读取文件获取传输语法
@@ -163,8 +174,26 @@ void DICOMPixelDataHelper::GetOverlayData(const char *path, void *data,
if(dcmImage.getOverlayCount()>plane){
const void * overlay = dcmImage.getFullOverlayData(plane,width, height);
int dataLength = width*height;
data = new unsigned char[dataLength];
memcpy(data, overlay,dataLength);
if (plane == 0){
memcpy(data, overlay, dataLength);
}
else{
int count32 = dataLength / 4;
int tailCount8 = dataLength % 4;
//OR operation header and content
Uint32 * mergeDst = (Uint32*)data;
Uint32 * mergeSrc = (Uint32*)overlay;
for (int i = 0; i < count32; ++i) {
mergeDst[i] = mergeDst[i] | mergeSrc[i];
}
//OR operation tail
Uint8 * mergeDst8 = (Uint8*)data;
Uint8 * mergeSrc8 = (Uint8*)overlay;
for (int i = 1; i <= tailCount8; ++i) {
mergeDst8[dataLength - i] = mergeDst8[dataLength - i] | mergeSrc8[dataLength - i];
}
}
dcmImage.deleteOverlayData();
}
else{
width=-1;

View File

@@ -42,6 +42,7 @@ public:
*/
static void GetRGBPixelData(const char * path, void* data, unsigned long& length);
static int GetOverLayCount(const char *path);
static void GetOverlayData(const char * path, void* data,
unsigned int& width, unsigned int& height,unsigned int plane = 0);

View File

@@ -54,6 +54,9 @@ public:
vtkGetMacro(PixelRepresentation, unsigned short)
vtkSetMacro(PixelRepresentation, unsigned short)
vtkGetMacro(HasOverlay, bool)
vtkSetMacro(HasOverlay, bool)
vtkSetVector3Macro(Spacing,double);
vtkGetVector3Macro(Spacing,double);
@@ -131,6 +134,7 @@ protected:
unsigned short SamplePerPixel;
unsigned short BitsAllocated;
unsigned short PixelRepresentation;
bool HasOverlay = false;
std::vector<std::string> FileNames;
std::string uniqueID;
vtkNew<vtkMatrix4x4> OrientationMatrix;

View File

@@ -99,6 +99,24 @@ void vtkDICOMImageReader2::ExecuteDataWithInformation(vtkDataObject *output,
for (int i = 0; i < properties->GetFileNames().size(); ++i) {
const std::string &path = properties->GetFileNames()[i];
int overlayCount = DICOMPixelDataHelper::GetOverLayCount(path.c_str());
if (overlayCount > 0){
if (!OverLayData){
HasOverlay = true;
OverLayData = vtkImageData::New();
OverLayData->SetExtent(data->GetExtent());
OverLayData->SetSpacing(data->GetSpacing());
OverLayData->SetOrigin(data->GetOrigin());
OverLayData->AllocateScalars(VTK_UNSIGNED_CHAR,1);
}
unsigned int width = 0;
unsigned int height = 0;
void* overlayBuffer = OverLayData->GetScalarPointer(0, 0, i);
for (int j = 0; j < overlayCount; ++j) {
DICOMPixelDataHelper::GetOverlayData(path.c_str(), overlayBuffer, width, height);
}
}
unsigned long imageDataLength;
@@ -115,6 +133,7 @@ void vtkDICOMImageReader2::ExecuteDataWithInformation(vtkDataObject *output,
DICOMPixelDataHelper::GetPixelData(path.c_str(), buffer, imageDataLength);
}
buffer = ((char *) buffer) + imageDataLength;
}
@@ -143,3 +162,7 @@ void vtkDICOMImageReader2::SetFileNames(const std::vector<std::string>& files) {
this->DICOMFileNames->push_back(fileString);
}
}
vtkImageData *vtkDICOMImageReader2::GetOutputOverLayData() {
return OverLayData;
}

View File

@@ -34,6 +34,12 @@ public:
return DICOMFileNames;
}
double* GetPixelSpacing();
vtkGetMacro(HasOverlay, bool);
vtkSetMacro(HasOverlay, bool);
vtkImageData* GetOutputOverLayData();
protected:
void SetupOutputInformation(int num_slices);
@@ -53,7 +59,9 @@ protected:
private:
vtkDICOMImageReader2(const vtkDICOMImageReader2&) = delete;
void operator=(const vtkDICOMImageReader2&) = delete;
ExtendMedicalImageProperties* properties;
ExtendMedicalImageProperties* properties = nullptr;
vtkImageData* OverLayData = nullptr;
bool HasOverlay = false;
};