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,否则会出现一大堆路径错误
二、补充完成后项目的依赖库如下:
再次编译工程,顺利通过编译,此处利用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中。(基本调用流程如下图。
- VS2010+DCMTK3.6.0 : JPEG无损压缩DCM文件
- 使用dcm4che3对jpeg压缩的dcm文件进行解压
- DICOM医学图像处理:开源库mDCM与DCMTK的比较分析(一),JPEG无损压缩DCM图像
- DICOM医学图像处理:开源库mDCM与DCMTK的比较分析(一),JPEG无损压缩DCM图像(续)
- DICOM医学图像处理:开源库mDCM与DCMTK的比较分析(一),JPEG无损压缩DCM图像
- FPGA实现JPEG-LS无损压缩算法
- DCMTK3.6.0库在vs2010下编译成功通过
- VS2010+DCMTK3.6.0 : MT支持库 安装说明
- 无损压缩
- 无损压缩
- 无损压缩
- DICOM:dcm4che工具包如何压缩dcm文件探讨(续篇)
- DCMTK3.6.0入门指南
- DCMTK3.6.0入门指南
- jpeg压缩
- jpeg压缩
- dcm文件编程
- 图片无损压缩
- android studio快捷键设置。
- Android Studio 的 instrumentation测试(第一个练习)
- 小韵游戏开发学习笔记——第三期:Unity工程创建及界面功能的基本介绍
- Linux显示中文乱码解决方法
- google nfc 基础文档翻译 (上)
- VS2010+DCMTK3.6.0 : JPEG无损压缩DCM文件
- [原]JSON和JS对象
- JavaScript_利用eval函数求字符串数学表达式的值
- JAVA AES加密算法实现代码
- (一)OGG的安装与配置,并实现单向DML复制操作
- 利用grep 比较两个文件的异同
- 套接字选项setsockopt中参数之SO_REUSEADDR
- 关于百度地图坐标转换接口的研究
- ssh 反向隧道访问内网机器