1. 概述
在项目中为了保留对之前代码的兼容和加上新功能,需要将多帧的Dcm图像转换为单帧的Dcm图像,近期对其进行了实践。本篇文章中将实现的代码予以分享,不妥之处请见谅。多帧图像
2. 实现代码
之前有两篇博客分别讲了DCMTK在vs上配置过程和读取Dcm图的实现,感兴趣的读者可以看看之前的文章。
//************************************************************************
// 函数名称: LoadDcmDataSet
// 访问权限: public
// 创建日期: 2016/11/28
// 创 建 人:
// 函数说明: 加载Dcm图像返回它的DicomImage
// 函数参数: std::string file_path 文件的路径
// 返 回 值: DicomImage* $
//************************************************************************
DicomImage* CLoadMutiFrameDcm::LoadDcmDataSet(std::string file_path)
{
this->filepath = file_path;
DcmFileFormat fileformat;
OFCondition oc = fileformat.loadFile(file_path.c_str()); //读取Dicom图像
if (!oc.good()) //判断Dicom文件是否读取成功
{
std::cout << "file Load error" << std::endl;
return nullptr;
}
DcmDataset *dataset = fileformat.getDataset(); //得到Dicom的数据集
E_TransferSyntax xfer = dataset->getOriginalXfer(); //得到传输语法
OFString patientname;
dataset->findAndGetOFString(DCM_PatientName, patientname); //获取病人姓名
unsigned short bit_count(0);
dataset->findAndGetUint16(DCM_BitsStored, bit_count); //获取像素的位数 bit
OFString isRGB;
dataset->findAndGetOFString(DCM_PhotometricInterpretation, isRGB); //DCM图片的图像模式
unsigned short img_bits(0);
dataset->findAndGetUint16(DCM_SamplesPerPixel, img_bits); //单个像素占用多少byte
this->Img_bitCount = (int)img_bits;
OFString framecount;
dataset->findAndGetOFString(DCM_NumberOfFrames, framecount); //DCM图片的帧数
//DicomImage* img_xfer = new DicomImage(xfer, 0, 0, 1); //由传输语法得到图像的帧
unsigned short m_width; //获取图像的窗宽高
unsigned short m_height;
dataset->findAndGetUint16(DCM_Rows, m_height);
dataset->findAndGetUint16(DCM_Columns, m_width);
/
const char* transferSyntax = NULL;
fileformat.getMetaInfo()->findAndGetString(DCM_TransferSyntaxUID, transferSyntax); //获得传输语法字符串
string losslessTransUID = "1.2.840.10008.1.2.4.70";
string lossTransUID = "1.2.840.10008.1.2.4.51";
string losslessP14 = "1.2.840.10008.1.2.4.57";
string lossyP1 = "1.2.840.10008.1.2.4.50";
string lossyRLE = "1.2.840.10008.1.2.5";
if (transferSyntax == losslessT