VS2010+DCMTK3.6.0 : JPEG无损压缩DCM文件

来源:互联网 发布:淘宝哪里看几颗心 编辑:程序博客网 时间:2024/05/08 22:57

    利用DCMTK开源库完成JPEG无损压缩,得到.dcm的图像文件。(DCMTK_example.sln)

    从下面这些博客中学习,非常详细和全面,算是很经典的文章:

    一、基于DCMTK的DICOM相关程序编写攻略:

        http://blog.csdn.net/jackmacro/article/details/5332654

    二、DICOM医学图像处理:DCMTK在VS2012中的配置:

        http://blog.csdn.net/zssureqh/article/details/38460445

    三、DCMTK3.6.0 (MT支持库)安装 完整说明:

        http://blog.163.com/qimo601@126/blog/static/158220932012113771496/

         四、DCMTK开源库对DCM文件的JPEG无损压缩功能所需要调用的函数进行分析:

            http://blog.csdn.net/zssureqh/article/details/38494319(DICOM医学图像处理:开源库mDCM与DCMTK的比较分析(一),JPEG无损压缩DCM图像)


下面是从中学习到的知识:

    一、基于DCMTK的DICOM相关程序。

       1、建立自己的应用工程并将其加入DCMTK的工作空间(Project->Insert Project To WorkSpace)。

       2、在自己的工程中加入需要使用的DCMTK静态库和头文件。

       按照正确的顺序填写链接库文件(对于链接库来说顺序也是很重要的!) DCMTK库有下面这些依赖关系:

       dcmdata -》 ofstd

       dcmimage -》 dcmimgle, dcmdata, ofstd

       dcmimgle -》dcmdata, ofstd

       dcmjpeg -》ijg8, ijg12, ijg16, dcmimage, dcmimgle, dcmdata, ofstd

       dcmnet -》dcmdata, ofstd

       dcmpstat -》 dcmimage, dcmimgle, dcmsign, dcmsr, imagectn, dcmtls, dcmnet, dcmdata,       ofstd

       dcmsign -》dcmdata, ofstd

       dcmsr -》dcmdata, ofstd

       dcmtls -》dcmnet, dcmdata, ofstd

       dcmwlm -》dcmnet, dcmdata, ofstd

       imagectn -》 dcmnet, dcmdata, ofstd

       3、编译自己的工程。

       4、不成功的可能有如下一些问题。

       (1)对于单文档工程,运行时提示:

       generated debug assertion

       if (!ProcessShellCommand(cmdInfo))

       return FALSE;

       -- File: docsingl.cpp

       Line: 215

原因:缺少AFX_IDS_UNTITLED的字符串

解决:在资源文件的STRING TABLE中加入 ID= AFX_IDS_UNTITLED的键值。

       (2)编辑时提示:

fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds

原因:

解决:在Project->Settings->Preprocessor definitions中去掉 _AFXDLL项。

       (3)编译时提示:

LIBCMTD.lib(dbgheap.obj):error LNK2005: _malloc already defined in msvcrtd.lib(MSVCRTD.dll)

原因:由于VC在编译时试图从两个不同的库中写入同一个函数代码,只要忽略这些相冲突的默认库就可以解决。

解决:在Project->Settings->Link->Category->Input—>Ignore Liberies中加入

相应的msvcprtd.lib,msvcrtd.lib等。

另一种解决:保证自己的编译环境为:

       A)project->settings->c/c++->category->code generation的use run-time library 为debug multithreaded.

       B) 在Project->Settings->Preprocessor definitions中去掉 _AFXDLL项。

       C)如果需要,在资源文件的STRING TABLE中加入 ID= AFX_IDS_UNTITLED的键值。

       D)这样就不需要忽略那些库了。

还有可以:

后来尝试了很多方法,经过摸索,最后得出解决方法:

在Preprocessor中定义_AFXDLL

如果它提示:fatal error C1189: #error : Please use the /MD switch for _AFXDLL builds

就这样改:

C/C++->Code Generation->Multithread DLL (即实现/MD选项)

       (4)编译时提示:

dcmdata.lib(dcuid.obj) : error LNK2001: unresolved external symbol _Netbios@4

原因:缺少所需的链接库文件

解决:在自己的工程中加入需要使用的DCMTK静态库和头文件,并注意顺序。

       (5)编译时提示:

fatal error LNK1181: cannot open input file。。。。。。。 Debug.obj

原因:类似错误,可能是由于目录中含有太长的中文名字。

解决:可以将中文的目录名改为英文就OK

       (6)运行时提示:

原因:

解决:在Project->Settings->Preprocessor definitions中去掉 _AFXDLL项。

       (7)如果将已经make好的dcmtk目录复制到其它目录,则需要重新make,否则会出现一大堆路径错误


    二、补充完成后项目的依赖库如下

                         image

        再次编译工程,顺利通过编译,此处利用DCMTK论坛中给的DCM图像的JPEG无损压缩,顺利实现了对DCM图像的压缩。

        具体的VS2012工程代码:http://download.csdn.net/detail/zssureqh/7734777

        选用的VS2012版本为:cn_visual_studio_ultimate_2012_x86_dvd_920954

        选用的DCMTK版本为:3.6.0

    (注:链接是原博主zssure给的代码,VS2012。我用VS2010,利用原博主zssure给的.h和.c文件,配置好工程属性,最重要的是博文中给出的库的链接顺序,成功完成编译。)


     三、WIN7 + VisualStudio2010 + dcmtk3.6.0 安装测试小程序

    (1)新建一个empty win32 console application,在source文件夹下新建一个cpp文件,把以上源代码复制粘贴进去。

    (2) 右键单击工程名,选择属性(properties),在Configuration Properties->C/C++->General下,Additional Include Directories里加入上一步编译出来的include文件夹,我的电脑上是C:\Program Files\DCMTK\include,这一步是为了让程序能够找到头文件。

    (3) C/C++->code generation里,Runtime Library 选择/MTd,这一步是要和之前CMAKE的编译选项一致。

    (4)Linker->General里,Additional Library Directories里填写上一步编译出来的lib文件夹,我的电脑上是C:\Program Files\DCMTK\lib,这一步是为了让程序能够找到之前编译好的lib文件。

    (5) Linker->Input里,在Additional Dependencies 里依次加上wsock32.lib;netapi32.lib;ofstd.lib;oflog.lib;dcmdata.lib;zlib.lib;这一步是加入具体我们程序需要的lib文件。网上很多的帖子中,都没有提到oflog.lib这个文件,可能是由于旧的版本中并没有使用到这个文件。但是对于3.6.0版,这个lib文件是必需的。

    (6) Apply ,ok,编译工程,运行。


四、DCMTK开源库对DCM文件的JPEG无损压缩功能所需要调用的函数进行分析:

1) DicomFileFormat::loadFile,导入文件,主要是DcmMetaInfo和DcmDataset两部分;

2) Dataset::chooseReresentation,参数中会出现新旧传输语义TransferSyntax,函数根据新的语义对相应数据(主要是像素数据)进行处理,会调用DcmPixelData::canChooseRepresentation、DcmPixelData::chooseRepresentation

3) Dataset::canWriteXfer,参数中是新修改后的传输语义。

4) DcmFileFormat::saveFile,参数中需要指出修改后的传输语义。

——》随后会调用dcfilefo.cc文件中的validateMetaInfo函数(该函数中也需要指定新的传输语义)。

——》对文件元信息的各个元素分别调用DcmMetaInfo::search和chekMetaHeaderValue两个函数(在该函数内,会检测各个元信息元素是否存在,不存在会新建之并插入,其参数中就需要指出新的传输语义)

——》DcmElement::putString将新的传输协议写入到MetaInfo中。(基本调用流程如下图。

clip_image002[5]




0 0
原创粉丝点击