【转】DCMTK开源库的学习笔记1:将DCM文件保存成BMP文件或数据流(即数组)

转自:https://blog.csdn.net/zssureqh/article/details/8784980

DCMTK开源库介绍:

        DCMTK是目前最全面实现DICOM3.0标准的开源库,通过结合DCMTK开源库和CxImage图像开源库,能够很方便的开发属于自己的DCM文件编辑浏览软件。

DCMTK与CxImage的结合:

        下面记录”DCM文件到BMP文件格式的转换“的学习和探索的过程。

         1)BMP文件的格式这里不细讲(可自行参阅MSDN相关资料)。BMP属于设备无关图(DIB),内存中只要依次包含BMP文件头(BITMAPFILEHEADER)、BMP信息头(BITMAPINFOHEADER)、调色板(Palette),以及真实像素信息,就可以在所有显示设备中进行显示。因此将DCM文件转换到BMP格式的主要工作是:从DCM众多数据元中挑选出BMP文件头、信息头所必须的信息(如图像宽度、图像高度、每个像素所占的空间、像素数据等)。

         2)此次采用了dcmtk中的dcmimgle开发包,利用DicomImage类提供的createWindowsDIB接口以及writeBMP来进行格式转化。具体代码如下:

 

    DcmFileFormat *mImage=new DcmFileFormat();DJDecoderRegistration::registerCodecs(); // register JPEG codecsDcmDataset *dataset = mImage->getDataset();E_TransferSyntax xfer=dataset->getOriginalXfer();dataset->chooseRepresentation(EXS_LittleEndianExplicit,NULL);DicomImage *pdcmImage=new DicomImage((DcmFileFormat*)mImage,EXS_LittleEndianExplicit,CIF_AcrNemaCompatibility,0,1);if(pdcmImage->getStatus()!=EIS_Normal)exit(0);void* pDIB=NULL;int size=0;pdcmImage->createWindowsDIB(pDIB,size,0,8,1,1);

        至此,pDIB内存中就获得了”c:\test.dcm“文件像素数据多对应的BMP格式的数据。如果想将pDIB保存成BMP文件,还需要补充BMP文件头(BITMAPFILEHEADER)、BMP信息头(BITMAPINFOHEADER)、调色板(Palette)。参照MSDN中BITMAPFILEHEADER和BITMAPINFOHEADER的结构,逐个成员赋值即可。假设我们生成的文件头变量为mBmpFileHeader,信息头变量为mBmpInfoHeader。由于createWindowsDIB函数中的BMP像素位数设定的是8,所以BMP图像属于索引图像,其文件中需要调色板,调色板的生成如下所示(最简单的生成方法):

 

        RGBQUAD* mPalette=new RGBQUAD[256];memset(mPalette,0,sizeof(RGBQUAD)*256);for(int i=0;i<256;++i){mPalette[i].rgbBlue=i;mPalette[i].rgbGreen=i;mPalette[i].rgbRed=i;}

        随后将mBmpFileHeader、mBmpInfoHeader、mPalette添加到pDIB的前面,就构成了一幅BMP图像,直接将此数据保存成bmp文件即可。具体的链接步骤如下:

<span style="white-space:pre">	</span>int imgsize=width*height;int headsize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*256;int size=headsize+imgsize;BYTE* mDibImage=new BYTE[size];memset(mDibImage,0,size);memcpy(mDibImage,mBmpFileHeader,sizeof(BITMAPFILEHEADER));memcpy(&mDibImage[sizeof(BITMAPFILEHEADER)],mBmpInfoHeader,sizeof(BITMAPINFOHEADER));memcpy(&mDibImage[sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)],mPalette,sizeof(RGBQUAD)*256);memcpy(&mDibImage[headsize],pDIB,imgsize);

       至此mDibImage内存存储的数据就是一幅完整的BMP文件。将其保存后的结果如下图(左)所示:

 

 

 

       相比dcm浏览软件中看到的结果(上图右),自己生成的图像模糊很多。思考原因,可能是窗宽窗位的关系。DicomImage中也提供了调整窗宽窗位的接口setWindow。在调用createWindowsDIB函数之前,调用setW函数,随后生成的BMP图像结果如下:

 

 

与常用的dcm浏览软件中的结果一致。

源代码下载:

         鉴于有些网友向我询问完整源码的问题,以前都是直接邮箱发送的,最近嫌麻烦,就将完整的.h和.cpp文件上传到了CSDN中,资源链接是:http://download.csdn.net/detail/zssureqh/7860671,需要2个积分奥。哈哈,如果不是CSDN的朋友,或者没有积分的朋友也不要着急,也可以到我的Github主页进行免费下载,地址是:https://github.com/zssure-thu/DcmtkAndCxImage,有问题及时反馈,多多交流,共同进步。

 

作者:zssure@163.com

时间:2014-09-03(最后更新时间)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/436024.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何将C语言翻译成汇编语言,如何把汇编语言转换成C语言

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼程序:ORG 0000HLJMP MAINORG 000BHLJMP TIMEORG 1000HHOUR1 EQU 10hHOUR2 EQU 12hMIN1 EQU 14hMIN2 EQU 16hSEC1 EQU 18HCOUNT EQU 20HNUM1 EQU 22HNUM2 EQU 24HLL4 EQU 26Hs1 bit P1.0s2 bit P1.1s3 bit P1.2s4 bit P1.3A1 EQU 36…

数据库-Oracle【Oracle数据库设置默认表空间问题及Oracle,SQL,MySQL的自增变量设置】...

一、 Oracle数据库设置默认表空间问题 DBA们经常会遇到一个这样令人头疼的问题&#xff1a;不知道谁在Oracle上创建了一个用户&#xff0c;创建时&#xff0c;没有给这个用户指定默认表空间&#xff0c;所以这个用户就会采用默认的表空间——system表空间。导致系统表空间迅速被…

设计模式——Iterator模式实现研究

导读&#xff1a;软件设计模式是一种表达、记录和重用软件设计结构和设计经验的新方法&#xff0c;它对反复出现的设计结构的关键特征进行识别、抽象和命名&#xff0c;使重用成功设计和结构更加容易。本文介绍了软件设计模式的特点、描述方式以及在设计中使用模式带来的好处&a…

【转】DCMTK 开源库的学习笔记2:直接操作dcm文件中像素数据的尝试

转自&#xff1a;https://blog.csdn.net/zssureqh/article/details/8785132 DCMTK官网给出了JPEG格式压缩的DCM文件解压缩的方法&#xff08;http://support.dcmtk.org/docs/mod_dcmjpeg.html&#xff09;&#xff0c;代码摘录如下&#xff1a; DJDecoderRegistration::regist…

R语言处理非线性回归模型C-D方程,使用R语言进行多项式回归、非线性回归模型曲线拟合...

对于线性关系&#xff0c;我们可以进行简单的线性回归。对于其他关系&#xff0c;我们可以尝试拟合一条曲线。曲线拟合是构建一条曲线或数学函数的过程&#xff0c;它对一系列数据点具有最佳的拟合效果。使用示例数据集#我们将使Y成为因变量&#xff0c;X成为预测变量#因变量通…

认识IL

1.要编译的代码如下&#xff1a; using System; using System.Collections.Generic; using System.Text; namespace HellowWorld { class Program { static void Main() { Console.Write("Hello World!"); } } } 2…

c语言之多线程函数,如何用C语言实现多线程

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Windows操作系统&#xff0c;C语言实现多线程&#xff1a;#include #include DWORD APIENTRY ThreadOne ( LPVOID threadArg ){printf ( "线程开始啦&#xff0c;参数是&#xff1a;%s\n" , (char *)threadArg );return …

Iterator模式

Iterator模式的几种用法 在网络上看帖子时发现不少模式的初学者对Iterator模式的理解仅仅停留在从类库的容器类取得Iterator来遍历容器中的内容的程度。 因此在这里写几个例子&#xff0c;来加深大家对Iterator模式的理解。 对容器中元素的访问涉及到3个方面。 1&#xff0e;容…

【转】DCMTK开源库的学习笔记3:dcmtk文件中数据元的修改

转自&#xff1a;https://blog.csdn.net/zssureqh/article/details/8804736 dcm文件是医学领域DICOM3.0标准所对应的主要的文件格式。前两篇学习笔记中&#xff0c;学习了读取dcm文件的相关信息&#xff0c;如信息头MetaInformation元素、像素数据元素&#xff0c;只停留在了读…

设计模式C++实现 —— 外观模式、组合模式

外观模式应该是用的很多的一种模式&#xff0c;特别是当一个系统很复杂时&#xff0c;系统提供给客户的是一个简单的对外接口&#xff0c;而把里面复杂的结构都封装了起来。客户只需使用这些简单接口就能使用这个系统&#xff0c;而不需要关注内部复杂的结构。DP一书的定义&…

rsync的原理和安装使用及配制详解(三)(转)

5、示例脚本 这里这些脚本都是rsync网站上的例子&#xff1a; 1、每隔七天将数据往中心服务器做增量备份 #!/bin/sh# This script does personal backups to a rsync backup server. You will end up# with a 7 day rotating incremental backup. The incrementals will go# in…

单片机c语言控制显示器,单片机实现LCD液晶显示器控制原理..docx

摘 要LCD液晶显示已经是人机界面的关键技术。 本文对基于单片机的LCD夜晶显示器 控制系统进行了研究。首先在绪论中介绍了本课题的课题背景、 研究意义及完成的功能。本系统是以单 片机的基本语言C语言来进行软件设计&#xff0c;51的编程语言常用的有二种&#xff0c;一种是汇…

【转】DCMTK开源库的学习笔记4:利用ini配置文件对dcm影像进行归档

转自&#xff1a;https://blog.csdn.net/zssureqh/article/details/8846337 背景介绍&#xff1a; 医学影像PACS工作站的服务端需要对大量的dcm文件进行归档&#xff0c;写入数据库处理。由于医学图像的特殊性&#xff0c;每一个患者&#xff08;即所谓的Patient&#xff09;…

linux ( )含义,Linux的shell中$()、$[] 、${}分别是什么意思?

在bash中&#xff0c;$( )与 (反引号)都是用来作命令替换的。命令替换与变量替换差不多&#xff0c;都是用来重组命令行的&#xff0c;先完成引号里的命令行&#xff0c;然后将其结果替换出来&#xff0c;再重组成新的命令行。exp 1[rootlocalhost ~]# echo today is $(date &q…

导师评语(转)

星期一到了……小英在交完作业後&#xff0c;中午马上被老师叫去罚站&#xff0c;附加念500遍「我以後不敢编谎话欺骗老师了」。 why&#xff1f;为何这名老师要残忍的对待这名柔弱的小学生&#xff1f;我们来瞧瞧她的作文是怎麽写的…… ━━━━━━━━━━━━━━━━━━…

VxWorks平台下计算cpu的利用率

1、VxWorks的spyLib库提供的spy工具的实现原理。 Spy利用辅助定时器来产生中断&#xff0c;并且为每个任务维护一个计数器。然后记下被中断的任务&#xff0c;并且将该任务的计数器加一。经过一段时间后&#xff0c;每个任务的计数器反映了该任务占用CPU利用率的情况。很明显&a…

【转】DCMTK开源库类继承结构与DICOM3.0标准元素定义的对应关系图

转自&#xff1a;https://blog.csdn.net/zssureqh/article/details/9275271 最近由于课题需要&#xff0c;拿出来一些时间阅读了下DICOM3.0标准。在处理相关的DCM医学图像时使用了DCMTK开源库&#xff0c;废话不多说&#xff0c;直接贴图&#xff1a; 图一&#xff1a;DCMTK开…

c语言中用简易暗纹来输入密码,确定夫琅和费单缝衍射明、暗纹位置的不同教学方法的讨论...

崔红玲苏向英摘要&#xff1a;夫琅和费单缝衍射的明、暗纹位置及相应光强是波动光学中的重要部分&#xff0c;用不同的方法讲解效果不同。本文比较了惠更斯-菲涅耳原理定量积分法及半波带法得到的结论&#xff0c;表明在近似情况下&#xff0c;这两种方法都可以对其进行描述。关…

tickGet

tickGet&#xff08;&#xff09;返回的是从系统启动开始tick计数后的总的tick数目。 tick是啥&#xff0c;是“滴答”&#xff0c;它是一个数值量&#xff0c;本身不能代表时间。 如果说要知道tick增加一个代表多少时间的话&#xff0c;那就要看系统的时钟率了。 在Shell下…

C#控制台程序,发送邮件,可带附件

最近几天由于公司发送了大量内容相同的邮件,而被国外的反垃圾邮件组织列入了黑名单,致使很多客户收不到我们的邮件,客服接到投诉,而之前做的一个查询日志的小页面,因为某种原因,访问速度很慢,甚至这几天人一多,页面就总是超时.刚开始以为是程序问题或者是数据量比较大,但是程序…