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

随着对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
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值