随着对DICOM标准慢慢的理解,发现其实带有单张图片的dcm文件与QImage文件的互转并不是一件很难的事情,一般情况下,结果出不来的原因都是对DICOM标准不理解。然而往往一点点理解不够,可能浪费大量的事情,造成很大困扰。
带有多张图的dcm文件转QImage
这个最简单,在原有但张图的dcm文件转QImage文章(http://blog.csdn.net/syz9011/article/details/49777777)的基础上,只要在加上一句话,即可:
……
> dcmImage->setMinMaxWindow();
> if (dcmImage->getStatus() == EIS_Normal) {
int count = dcmImage->getFrameCount();
DicomImage *tempImage = 0;
for(int i = 0; i < count; i++) {
image = 0;
tempImage = dcmImage->createDicomImage(i, 1);
和上文的DicomImage转QImage的处理方式一样
}
> }
……
多张图片添加到一个dcm文件中
在添加多张图片到一个dcm文件之前,需要确保几张图片的samplesPerPixel, rows, cols, bitsAlloc, bitsStored, highBit, pixelRepr, planConf等参数均一致。因为无论是bmp图片,还是jpg图片,多张保存到一个dcm文件时,共享相同的DCM_SamplesPerPixel、DCM_Rows等tag,唯一不同的是DCM_PixelData这个tag对应的数据信息。(单张图片转dcm文件链接:http://blog.csdn.net/syz9011/article/details/49785559)
多张bmp图片
对于多张bmp图片的转换,比较容易。只需要将每张图片的像素信息连续保存起来,并放置到DCM_PixelData节点信息中即可。
假设一共有3张图片,每张图片的像素点信息保存到pixData中,每张图片的像素点长度为length,最后所有的像素点保存到finalData中,则:
char *finalData = new char[length*3];
memset(finalData, 0, length*3);
for(int i = 0; i < 3; i++) {
……获取像素点信息相关,和单张图片转dcm文件一致……
memcpy(finalData, pixData, length);
finalData += length;
}
finalData -= 3*length;
cond = dataSet->putAndInsertUint8Array(DCM_PixelData, OFreinterpret_cast(Uint8*, finalData), 3*length);
// 以下为必须内容,否则该dcm文件无论如何,打开只能看到一张图片
std::string temp = QString::number(3).toStdString();
cond = dataSet->putAndInsertString(DCM_NumberOfFrames, temp.c_str());
多张jpg图片
对于多张jpg图片,其实也是只需要将每张图片的像素点信息读取出来之后,添加到pixelSequence中就可以了,不需要再添加额外信息;
假设情况和bmp情况一样,则:
……初始化pixelSequence,并为pixelSequence添加一个offset等,和单张jpg图片转dcm文件一致……
for(int i = 0; i < 3; i++) {
……获取每张图片的像素点信息到pixData……
DcmOffsetList dummyList;
cond = pixelSequence->storeCompressedFrame(dummyList, OFreinterpret_cast(Uint8*,pixData), length, 0);
}
……然后初始化一个DcmPixelData,并putOriginalRepresentation为pixelSequence,
……然后dataSet->insert(pixelData, OFTrue)即可。
//同多张bmp图片保存一样,以下内容同样不可少:
std::string temp = QString::number(3).toStdString();
cond = dataSet->putAndInsertString(DCM_NumberOfFrames, temp.c_str());