Add some comment.

This commit is contained in:
Krad
2022-09-20 15:44:13 +08:00
parent 9e9f4d37fc
commit 6873e69571
7 changed files with 86 additions and 41 deletions

View File

@@ -187,10 +187,12 @@ void DICOMHeaderHelper::readHeaderFromFile(const char * filePath){
frameHeader.FrameIndex = i; frameHeader.FrameIndex = i;
DcmItem *perFrameGroup = nullptr; DcmItem *perFrameGroup = nullptr;
if (dataset->findAndGetSequenceItem(DCM_PerFrameFunctionalGroupsSequence, perFrameGroup, i).good()) { if (dataset->findAndGetSequenceItem(DCM_PerFrameFunctionalGroupsSequence,
perFrameGroup, i).good()) {
//calc instance number for frame //calc instance number for frame
DcmItem *frameContent = nullptr; DcmItem *frameContent = nullptr;
if (perFrameGroup->findAndGetSequenceItem(DCM_FrameContentSequence, frameContent, 0).good()) { if (perFrameGroup->findAndGetSequenceItem(DCM_FrameContentSequence,
frameContent, 0).good()) {
unsigned long frameNumber = 0; unsigned long frameNumber = 0;
frameContent->findAndGetUint32(DCM_InStackPositionNumber, frameNumber); frameContent->findAndGetUint32(DCM_InStackPositionNumber, frameNumber);
frameHeader.InstanceNumber = frameNumber + fileHeader.InstanceNumber; frameHeader.InstanceNumber = frameNumber + fileHeader.InstanceNumber;
@@ -198,10 +200,14 @@ void DICOMHeaderHelper::readHeaderFromFile(const char * filePath){
// try to get frame position // try to get frame position
DcmItem *framePosition = nullptr; DcmItem *framePosition = nullptr;
if (perFrameGroup->findAndGetSequenceItem(DCM_PlanePositionSequence, framePosition, 0).good()) { if (perFrameGroup->findAndGetSequenceItem(DCM_PlanePositionSequence,
if(framePosition->findAndGetFloat64(DCM_ImagePositionPatient, frameHeader.Position[0], 0).good()){ framePosition, 0).good()) {
framePosition->findAndGetFloat64(DCM_ImagePositionPatient, frameHeader.Position[1], 1); if(framePosition->findAndGetFloat64(DCM_ImagePositionPatient,
framePosition->findAndGetFloat64(DCM_ImagePositionPatient, frameHeader.Position[2], 2); frameHeader.Position[0], 0).good()){
framePosition->findAndGetFloat64(DCM_ImagePositionPatient,
frameHeader.Position[1], 1);
framePosition->findAndGetFloat64(DCM_ImagePositionPatient,
frameHeader.Position[2], 2);
}else{ }else{
//restore value //restore value
frameHeader.Position[0] = fileHeader.Position[0]; frameHeader.Position[0] = fileHeader.Position[0];
@@ -214,16 +220,16 @@ void DICOMHeaderHelper::readHeaderFromFile(const char * filePath){
0).good()) { 0).good()) {
if (frameOrientation->findAndGetFloat64(DCM_ImageOrientationPatient, if (frameOrientation->findAndGetFloat64(DCM_ImageOrientationPatient,
frameHeader.Orientation[0], 0).good()) { frameHeader.Orientation[0], 0).good()) {
frameOrientation->findAndGetFloat64(DCM_ImageOrientationPatient, frameHeader.Orientation[1], frameOrientation->findAndGetFloat64(DCM_ImageOrientationPatient,
1); frameHeader.Orientation[1],1);
frameOrientation->findAndGetFloat64(DCM_ImageOrientationPatient, frameHeader.Orientation[2], frameOrientation->findAndGetFloat64(DCM_ImageOrientationPatient,
2); frameHeader.Orientation[2],2);
frameOrientation->findAndGetFloat64(DCM_ImageOrientationPatient, frameHeader.Orientation[3], frameOrientation->findAndGetFloat64(DCM_ImageOrientationPatient,
3); frameHeader.Orientation[3],3);
frameOrientation->findAndGetFloat64(DCM_ImageOrientationPatient, frameHeader.Orientation[4], frameOrientation->findAndGetFloat64(DCM_ImageOrientationPatient,
4); frameHeader.Orientation[4],4);
frameOrientation->findAndGetFloat64(DCM_ImageOrientationPatient, frameHeader.Orientation[5], frameOrientation->findAndGetFloat64(DCM_ImageOrientationPatient,
5); frameHeader.Orientation[5],5);
}else{ }else{
//restore value //restore value
frameHeader.Orientation[0] = fileHeader.Orientation[0]; frameHeader.Orientation[0] = fileHeader.Orientation[0];
@@ -317,7 +323,9 @@ void DICOMHeaderHelper::ArrangeSeriesProperty() {
} }
} }
ExtendMedicalImageProperties* DICOMHeaderHelper::createProperty(const std::vector<DICOMFileHeader>& headerList, int splitIndex, int beginOffset) { ExtendMedicalImageProperties* DICOMHeaderHelper::createProperty(const std::vector<DICOMFileHeader>& headerList,
int splitIndex, int beginOffset) {
const DICOMFileHeader& header = headerList[beginOffset]; const DICOMFileHeader& header = headerList[beginOffset];
// create ExtendMedicalImageProperties and set values // create ExtendMedicalImageProperties and set values

View File

@@ -151,7 +151,7 @@ void DICOMPixelDataHelper::GetRGBPixelData(const char *path, void *data, unsigne
delete fileFormat; delete fileFormat;
} }
int DICOMPixelDataHelper::GetOverLayCount(const char *path) { int DICOMPixelDataHelper::GetOverlayCount(const char *path) {
int ret =0; int ret =0;
DcmFileFormat fileFormat; DcmFileFormat fileFormat;
if (fileFormat.loadFile(path).good()) { if (fileFormat.loadFile(path).good()) {
@@ -230,7 +230,7 @@ void DICOMPixelDataHelper::GetFramePixelData(const char *path, void *data, unsig
} }
} }
bool DICOMPixelDataHelper::StoreFileObject(const char *path) { bool DICOMPixelDataHelper::CacheFileObject(const char *path) {
DcmFileFormat *fileFormat = new DcmFileFormat();//读取文件获取传输语法 DcmFileFormat *fileFormat = new DcmFileFormat();//读取文件获取传输语法
if (fileFormat->loadFile(path).good() && fileFormat->loadAllDataIntoMemory().good()) { if (fileFormat->loadFile(path).good() && fileFormat->loadAllDataIntoMemory().good()) {
DICOMFileObjectCache::getInstance()->store(path,fileFormat); DICOMFileObjectCache::getInstance()->store(path,fileFormat);
@@ -241,7 +241,7 @@ bool DICOMPixelDataHelper::StoreFileObject(const char *path) {
} }
} }
void DICOMPixelDataHelper::ClearFileObject() { void DICOMPixelDataHelper::ClearFileObjectCache() {
DICOMFileObjectCache::getInstance()->clear(); DICOMFileObjectCache::getInstance()->clear();
} }

View File

@@ -26,18 +26,39 @@ public:
*/ */
static void GetPixelData(const char * path, void* data, unsigned long& length); static void GetPixelData(const char * path, void* data, unsigned long& length);
/**
* Check whether FileObject with path in cache
* @param path dcm file absolute path, and the cache key
* @return is in cache
*/
static bool CheckFileObjectCache(const char * path); static bool CheckFileObjectCache(const char * path);
static bool StoreFileObject(const char * path); /**
* Create a DcmFileFormat object with input path, and
* store it into the cache map.
* @param path dcm file absolute path, and the cache key
* @return cache success
*/
static bool CacheFileObject(const char * path);
static void ClearFileObject(); /**
* Clear all object cache in the store map
*/
static void ClearFileObjectCache();
/**
* Get multi-frame format dicom file Pixel Data
* @param path dcm file absolute path
* @param data output data pointer, must have been allocated.
* @param length output data length
* @param frameIndex frame index in pixel data
*/
static void GetFramePixelData(const char * path, void* data, unsigned long& length, const long& frameIndex); static void GetFramePixelData(const char * path, void* data, unsigned long& length, const long& frameIndex);
/** /**
* Get Pixel Data with Rescaled, result is calculate as Float, and arrange as Float. * Get Pixel Data with Rescaled, result is calculate as Float, and arrange as Float.
* @param path dcm file absolute path * @param path dcm file absolute path
* @param data output data buffer pointer * @param data output data buffer pointer, must have been allocated.
* @param length output data length * @param length output data length
*/ */
static void GetPixelDataFloat(const char * path, void* data, unsigned long& length); static void GetPixelDataFloat(const char * path, void* data, unsigned long& length);
@@ -45,13 +66,25 @@ public:
/** /**
* Get colorful Pixel Data as three component R,G,B color value. * Get colorful Pixel Data as three component R,G,B color value.
* @param path dcm file absolute path * @param path dcm file absolute path
* @param data output data buffer pointer * @param data output data buffer pointer, must have been allocated.
* @param length output data length * @param length output data length
*/ */
static void GetRGBPixelData(const char * path, void* data, unsigned long& length); static void GetRGBPixelData(const char * path, void* data, unsigned long& length);
static int GetOverLayCount(const char *path); /**
* Get Overlay data count
* @param path dcm file absolute path
* @return Overlay data count
*/
static int GetOverlayCount(const char *path);
/**
* Get Overlay data
* @param path dcm file absolute path
* @param data output data buffer pointer, must have been allocated.
* @param width output overlay width, usually same as image columns
* @param height output overlay height, usually same as image rows
*/
static void GetOverlayData(const char * path, void* data, static void GetOverlayData(const char * path, void* data,
unsigned int& width, unsigned int& height); unsigned int& width, unsigned int& height);

View File

@@ -5,10 +5,12 @@
#include <string> #include <string>
#include <vtkSmartPointer.h> #include <vtkSmartPointer.h>
#include "IO/Defines/DIDKitExport.h"
class ExtendMedicalImageProperties; class ExtendMedicalImageProperties;
class vtkImageData; class vtkImageData;
class DicomLoader { class DIDKIT_EXPORT DicomLoader {
public: public:
static void InitCodecs(); static void InitCodecs();

View File

@@ -10,7 +10,9 @@
#include <vtkNew.h> #include <vtkNew.h>
#include <vtkMatrix4x4.h> #include <vtkMatrix4x4.h>
class ExtendMedicalImageProperties: public vtkMedicalImageProperties{ #include "IO/Defines/DIDKitExport.h"
class DIDKIT_EXPORT ExtendMedicalImageProperties: public vtkMedicalImageProperties{
public: public:
static ExtendMedicalImageProperties *New(); static ExtendMedicalImageProperties *New();
vtkTypeMacro(ExtendMedicalImageProperties,vtkMedicalImageProperties); vtkTypeMacro(ExtendMedicalImageProperties,vtkMedicalImageProperties);

View File

@@ -98,25 +98,23 @@ void vtkDCMTKImageReader::ExecuteDataWithInformation(vtkDataObject *output,
// init codes to support compressed file // init codes to support compressed file
DICOMPixelDataHelper::InitCodecs(); DICOMPixelDataHelper::InitCodecs();
if (properties->GetHasOverlay()){
HasOverlay = true;
OverLayData = vtkImageData::New();
OverLayData->SetExtent(data->GetExtent());
OverLayData->SetSpacing(data->GetSpacing());
OverLayData->SetOrigin(data->GetOrigin());
OverLayData->AllocateScalars(VTK_UNSIGNED_CHAR,1);
}
for (int i = 0; i < properties->GetFileNames().size(); ++i) { for (int i = 0; i < properties->GetFileNames().size(); ++i) {
const std::string &path = properties->GetFileNames()[i].first; const std::string &path = properties->GetFileNames()[i].first;
const long &frameIndex = properties->GetFileNames()[i].second; const long &frameIndex = properties->GetFileNames()[i].second;
if (properties->GetHasOverlay()){ if (properties->GetHasOverlay()){
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 width = 0;
unsigned int height = 0; unsigned int height = 0;
void* overlayBuffer = OverLayData->GetScalarPointer(0, 0, i); void* overlayBuffer = OverLayData->GetScalarPointer(0, 0, i);
DICOMPixelDataHelper::GetOverlayData(path.c_str(), overlayBuffer, width, height); DICOMPixelDataHelper::GetOverlayData(path.c_str(), overlayBuffer, width, height);
} }
unsigned long imageDataLength; unsigned long imageDataLength;
@@ -132,9 +130,9 @@ void vtkDCMTKImageReader::ExecuteDataWithInformation(vtkDataObject *output,
} else { } else {
if (frameIndex>=0){ if (frameIndex>=0){
if (!DICOMPixelDataHelper::CheckFileObjectCache(path.c_str())){ if (!DICOMPixelDataHelper::CheckFileObjectCache(path.c_str())){
if(!DICOMPixelDataHelper::StoreFileObject(path.c_str())){ if(!DICOMPixelDataHelper::CacheFileObject(path.c_str())){
vtkErrorMacro(<< "Fail to read file:"<<path.c_str()); vtkErrorMacro(<< "Fail to read file:"<<path.c_str());
DICOMPixelDataHelper::ClearFileObject(); DICOMPixelDataHelper::ClearFileObjectCache();
// finalize codecs // finalize codecs
DICOMPixelDataHelper::FinalizeCodecs(); DICOMPixelDataHelper::FinalizeCodecs();
return; return;
@@ -149,7 +147,7 @@ void vtkDCMTKImageReader::ExecuteDataWithInformation(vtkDataObject *output,
buffer = ((char *) buffer) + imageDataLength; buffer = ((char *) buffer) + imageDataLength;
} }
DICOMPixelDataHelper::ClearFileObject(); DICOMPixelDataHelper::ClearFileObjectCache();
// finalize codecs // finalize codecs
DICOMPixelDataHelper::FinalizeCodecs(); DICOMPixelDataHelper::FinalizeCodecs();
} }

View File

@@ -10,9 +10,11 @@
#include <vector> #include <vector>
#include <string> #include <string>
#include "IO/Defines/DIDKitExport.h"
class ExtendMedicalImageProperties; class ExtendMedicalImageProperties;
class vtkDCMTKImageReader: public vtkImageReader2 { class DIDKIT_EXPORT vtkDCMTKImageReader: public vtkImageReader2 {
public: public:
//@{ //@{
/** /**