关闭

DCMTK:带有多张图片的dcm文件转成多张QImage与多张图片添加到一个dcm文件

标签: dicomdcmtk多张图片QImage
742人阅读 评论(0) 收藏 举报
分类:

随着对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());

单张图片转dcm链接
只含一张图片的dcm文件转QImage

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:4137次
    • 积分:120
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    文章分类
    文章存档
    最新评论