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

原创 2015年11月18日 19:33:54

随着对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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

QT下实现将图片从一个文件拷贝到另一个文件夹

由于项目的需要,从MFC转移到QT进行开发 首先要实现,MFC上的CString字符串操作要换成QString 将图片从一个文件拷贝到另一个文件夹, 以前是这样写的: //void folder...

DICOM医学图像处理:DICOM存储操作之“多幅BMP图像数据存入DCM文件”

背景: 本专栏“DICOM医学图像处理”受众较窄,起初只想作为自己学习积累和工作经验的简单整理。前几天无聊浏览了一下,发现阅读量两极化严重,主要集中在“关于BMP(JPG)与DCM格式转换”和“DI...
  • zssureqh
  • zssureqh
  • 2014年12月24日 08:28
  • 12608

dicom文件的显示(基于dcmtk实现)

采用VC++MFC实现,我把主要的代码给贴上来了。虽然网上也可以搜到部分代码,但是没有具体的实现过程。由于我们采用dcmtk能够将dib读取出来,但是没有调色板,所以我们需要自己构造我们的调试板,具体...
  • myyzqt
  • myyzqt
  • 2012年03月26日 09:11
  • 1072

【学习DCMTK】VC读取dicom图像

#include "dcmtk/dcmdata/dctk.h"

用VC++和DCMTK显示DICOM医学图像

 用VC++和DCMTK显示DICOM医学图像 摘 要 DICOM是医学影像存储和传输的国际标准,它的制定为不同的医学影像设备和用户提供了统一的接口标准和交互协议。解读 DICOM 的医学图像文件格式...

多帧Dcm图片的读取与拆分存储

1. 概述 在项目中为了保留对之前代码的兼容和加上新功能,需要将多帧的Dcm图像转换为单帧的Dcm图像,近期对其进行了实践。本篇文章中将实现的代码予以分享,不妥之处请见谅。多帧图像 2. 实现代码 ...
  • m_buddy
  • m_buddy
  • 2016年11月28日 15:41
  • 1618

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

DCMTK:DCM文件转QImage

代码如下,暂做记录QImage *image = 0; ///register RLE decompression codecs DcmRLEDecoderRegistration::register...
  • syz9011
  • syz9011
  • 2015年11月11日 09:29
  • 660

DICOM医学图像处理:DICOM存储操作之 “多幅JPG图像数据存入DCM文件”

背景:续上篇,继续介绍如何将多幅JPG图像数据存入DCM文件。即将有损压缩数据直接写入DCM文件,存储为Multi-frame形式。...

VC Edit控件自动换行显示方法

方法一.将EDIT映射到一CString m_String = m_String + sNewString + "\r\n"    //自动换行 UpdateData(false); ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DCMTK:带有多张图片的dcm文件转成多张QImage与多张图片添加到一个dcm文件
举报原因:
原因补充:

(最多只允许输入30个字)