基于DCMTK的DICOM相关程序编写攻略
2011-01-10 08:22
260 查看
基于
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
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
相关文章推荐
- 基于DCMTK的DICOM相关程序编写攻略
- 【转帖】基于DCMTK的DICOM相关程序编写攻略
- 基于DCMTK的DICOM相关程序编写攻略
- 基于DCMTK的DICOM相关程序编写攻略
- 基于TCP网络通信的自动升级程序源码分析--生成升级文件相关的配置文件
- 基于python编写的天气抓取程序
- 编写基于MFC的Vega程序步骤
- linux下用C编写的基于smtp的带附件邮件发送程序
- 编写高质量代码改善C#程序的157个建议——建议147:重构多个相关属性为一个类
- 基于线性表:编写26个字母按特定字母值插入或删除的完整程序
- C语言编写基于TCP和UDP协议的Socket通信程序示例
- C#编写的日英字典程序 - 基于EDict
- 基于libmad编写mp3解码程序
- 编写基于的POP3的电子邮件程序
- 基于Python编写的Windows服务程序参考代码
- 使用IDEA编写基于Scala的spark程序中的常见问题
- MFC编写图形化的c++程序(基于对话框的图形界面程序)
- 编写基于MFC的Vega程序步骤
- 编写基于DirectShow流媒体播放器程序可以值得参考的资料和源码例子
- 基于Java语言的安卓程序编写之七TextView控件