基于 DCMTK 的 DICOM 相关程序编写攻略
前言:
由于现在的医学影像设备的图像存储和传输正在逐渐向 DICOM 标准靠拢,在我们进行医学图像处理的过程中,经常需要自己编写和 DICOM 格式的图像相关的各种程序模块,以完成自己处理功能。如果从头开始理解 DICOM 的协议,然后完全自己编写这些代码来实现这些协议,是一件工程浩大的事情。德国 offis 公司开发的 DCMTK ,为我们提供了实现 DICOM 协议的一个平台,使得我们可以在它的基础上轻松的完成自己的主要工作,而不必把太多的精力放在实现 DICOM 协议的细节问题上。本文以 WINDOWSXP+VC6.0 为开发平台,从 DCMTK 的下载、调试、使用等方面介绍基于 DCMTK 的 DICOM 相关程序编写过程。
一、 DCMTK 简介
DCMTK 是由德国 offis 公司提供的 开源项目,并拥有相应的版权。这个开发包经过 10 多年的开发和维护,已经基本实现了 DICOM 协议的所有内容。该开发包提供所有的源代码、支持库和帮助文档。 DCMTK 提供了在各种操作系统下使用的可能版本,如 LINUX 、 SUN 、 WINDOWS 等,用户可更具自己的开发平台进行编译。目前 DCMTK 的版本是 3.5.3 。
二、 DCMTK 的下载和调试
DCMTK 公司的主页是: http ://dicom.offis.de 。
1 、首先下载 DTMTK 源代码。可以通过以下地址: ftp://dicom.offis.de/pub/dicom/offis/software/dcmtk/dcmtk353/dcmtk-3.5.3.zip
2 、下载相关的支持库:
ftp://dicom.offis.de/pub/dicom/offis/software/dcmtk/dcmtk353/support/dcmtk-3.5.3-win32-i386-support.zip
3 、安装或调试。
( 1 )首先是将 DCMTK 的源代码解压后和它的支持库放在同一个目录下面。
( 2 )使用 CMake 软件得到 DCMTK 的工程文件。
使用 MAKE 工具 CMake ,不仅可以创建 DCMTK 编译项目文件,还可以对 DCMTK 进行配置。步骤如下
①从 http://www.cmake.org/HTML/Download.html 下载 CMake for Windows 最新的版本。
②安装 CMake 并对 CMake 的如下选项进行设置(设置前需先删除原来的旧项目文件):如图 1 所示
Where is the source code: dcmtk-3.5.3 path
Where to build the binaries: dcmtk-3.5.3 path
Build for: Visual Studio 6
Configure --> Modify Cache Values! --> Configure
OK!
图 1 。使用 CMake 创建 DCMTK 编译项目文件
( 3 )用 VC6 打开项目文件 DCMTK.dsw 进行编译,根据提示,在编译环境( Tools - >Option - >Directories )中加入相应的头文件和库文件。
( 4 ) DCMTK 的编译可能需要比较长的时间,过程中也可能出现各种连接错误,大都有编译环境引起。
三、基于 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, ofs td
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 ,否则会出现一大堆路径错误
四、一个实际的例子
我们经常使用的 DICOM 主要是读和写 DICOM 文件。下面以读写 DICOM 为例 DCMTK 的使用方法。
五、其它一些相关的问题
1 、把 DCMTK 当作静态库使用: DCMTK 本身提供的是静态库即 Lib ,在链接进自己的工程时会将全部的函数加入,因此造成可执行文件很大,而且不便于升级;如果需要使用 DCMTK 作为动态库链接,需要自己建立相应的 Dll 工程,然后把原来的程序文件加进来,再写一个导出函数的文件,这些导出函数保持固定。这样其它地方使用的时候不会因为动态库程序升级又重新编译。
2 、
参考文件:
1、 DCMTK 的常见问题论坛: http://forum.dcmtk.org/
2、 DCMTK 的帮助文档: ftp://dicom.offis.de/pub/dicom/offis/software/dcmtk/dcmtk353/docs/dcmtk-3.5.3-html-help.zip
3、 DICOM 标准 2004 版。
4、 DICOM Validation Tool ( DVT )是一个 DICOM 有效性测试工具,用来测试产品的 DICOM 兼容性。 ADVT 顾名思义就是 Agfa 提供的 DICOM Validation Tool......
5、
6、
7、 http://www.pacser.net/dispbbs.asp?boardID=20&ID=72&page=1