DCMTK是一个比较优秀的支持DICOM文件读写的C++版本第三方库。
目录
1.下载DCMTK的源文件包和支持库
下载链接:https://dicom.offis.de/dcmtk.php.en
源文件:
支持库:
下载后进行解压
DCMTK支持库的参数说明:
选择MD的表示构建动态库,MT表示构建静态库,代码会很大。
选择iconv的,icu的库会很大。
2.使用Cmake构建DCMTK工程
2.1 CMake下载
网上说CMake版本一定一定要小于3.19.0,建议选择3.14.3。
CMake官网:https://cmake.org/download/
CMake3.14.3下载:https://github.com/Kitware/CMake/releases?
page=9
确定CMake是否安装成功:打开cmd,输入
cmake --version
2.2 使用CMake构建工程
-
关闭所有和VS有关的程序,然后打开CMake-gui
-
设置soure code路径,就是DCMTK包解压后的路径
-
设置build the binaries路径,就是构建出来的DCMTK工程的存放路径(这里自己新建一个文件夹DCMTK_Solution)
扫描二维码关注公众号,回复: 13488992 查看本文章 -
勾选Grouped和Advanced
-
点击Conifigue,在打开的窗口里选择相应的VS版本(这里为Visual Studio 16 2019 Win64),点击Finish
-
等待设置完成后,界面出现设置选项,进行设置
-
BUILD组设置如图
将BUILD_SHARED_LIBS打勾,因为下载的是MD的工程(动态链接库),程序运行的过程中是需要dll文件的。
-
CMAKE组:可以选择保持默认。但如果C盘只有管理员权限,则可以将CMAKE_INSTALL_PREFIX设置为其他路径(后续修改工程的CMake文件也可以,这里我选择新建一个文件夹DCMTK_LIB用于存放),这个设置就是下一步DCMTK工程编译出来的一系列文件的存放路径。
(我建议这里新建一个文件夹DCMTK_LIB,后续新建VS工程配置环境的时候需要用到这个文件夹里面的配置文件)
-
DCMTK组:
取消勾选DCMTK_ENABLE_EXTERNAL_DICTIONARY
取消勾选DCMTK_OVERWRITE_WIN32_COMPILER_FLAGS
勾选如下这些:
-
DOXYGEN组和ICU组按默认设置不需要修改
-
WITH组
将DCMTK支持库dcmtk-3.6.6-win64-support-MD-iconv-msvc-15.8
中的几个模块按照名字一一对应填入WITH组中,
其中WITH组中有一个WITH_SNDFILEINC模块
在DCMTK源码中没有这个模块,那就不填。
填完后如下所示:
-
再次点击Configure,等待进一步设置完成
-
再点击Generate,生成工程后,可以在DCMTK_Solution文件夹里面看到生成的配置文件
-
点击Open Project打开工程
2.3 检查工程属性
- 打开VS2019的工程文件,查看任一工程的属性,查看以下工程选项(如果都满足,表示DCMTK工程构建成功)
- 字符集是否设置为多字节字符集
- 运行库是否为MDd和MD(Debug和Release环境下都看看)
3.编译DCMTK库
- 打开VS2019菜单栏中的生成->批生成对话框,在ALL_BUILD里勾选Debug和Release,点击生成,编译完成后会在工程bin目录下生成exe和dll,lib目录下生成lib。
(注意把文件选项改成ALL_BUILD)
生成过程需要等待一段时间。。。
编译成功后:
- 在VS2019中打开批生成对话框,在INSTALL里勾选你想配置的install版本(Debug或Release),这步的作用是将DCMTK所需要的库文件和头文件拷贝到刚才CMake中设置的路径(这里我放到了DCMTK_LIB文件夹中,只选择了Debug)
- 点击Build,会将相应的文件拷贝到最初在CMake里设置的CMAKE_INSTALL_PREFIX的路径下
- bin目录里为exe和dll
- include目录为头文件
- lib目录下生成lib
- PS:将支持库包里的zlib_d.lib拷贝到生成的lib目录下(这里因为我生成的是Debug库,所以拷贝的是zlib_d.lib库)
4.编写测试用例验证DCMTK库
4.1 VS环境配置
- 新建一个控制台程序
- 配置该工程项目的中VC++目录——包含目录和库目录
(注意保持环境一致)
- 配置相关的依赖库
iphlpapi.lib
ws2_32.lib
wsock32.lib
netapi32.lib
ofstd.lib
oflog.lib
dcmdata.lib
zlib_d.lib
(前四个为系统库、随后三个为DCMTK库、最后一个是支持包里的库)
- 将DCMTK的bin目录下的ofstd.dll,oflog.dll,dcmdata.dll拷贝到该工程的exe程序同目录下
4.2 编写测试代码
- 先下载所需要的Dicom文件,并把文件路径修改在代码中
网址:https://www.dicomlibrary.com/
进去之后左下角DICOM Samlples随便点一个图片进去——点击上面的Export——Download
解压后如下:
- 编写测试代码
本程序的功能:
读DICOM文件中的病人名(函数ReadPatientName());
保存DICOM文件中的病人名(SavePatientName())。
// C++_Dicom_Sample.cpp : Defines the entry point for the console application.
//
#include <dcmtk/config/osconfig.h>
#include <dcmtk/dcmdata/dctk.h>
#include <iostream>
bool ReadPatientName(DcmFileFormat& fileformat, std::string& filePath)
{
OFCondition status = fileformat.loadFile(filePath.c_str());
if (!status.good())
{
std::cout << "Load Dimcom File Error: " << status.text() << std::endl;
return false;
}
OFString PatientName;
status = fileformat.getDataset()->findAndGetOFString(DCM_PatientName, PatientName);
if (status.good())
{
std::cout << "Get PatientName:" << PatientName << std::endl;
}
else
{
std::cout << "Get PatientName Error:" << status.text() << std::endl;
return false;
}
return true;
}
bool SavePatientName(DcmFileFormat& fileformat, std::string& filePath, const std::string& info)
{
OFCondition status = fileformat.getDataset()->putAndInsertString(DCM_PatientName, info.c_str());
if (status.good())
{
std::cout << "Save PatientName:" << info.c_str() << std::endl;
}
else
{
std::cout << "Save PatientName Error: " << status.text() << std::endl;
return false;
}
status = fileformat.saveFile(filePath.c_str());
if (!status.good())
{
std::cout << "Save Dimcom File Error: " << status.text() << std::endl;
return false;
}
return true;
}
int main()
{
DcmFileFormat dicomFileformat; //定义DICOM格式的变量
std::string dicomFile = "E:\\C++_work\\DCMTK_Sample\\Anonymized_20211126\\series-00000\\image-00001.dcm";
ReadPatientName(dicomFileformat, dicomFile); //读写病人的名称
SavePatientName(dicomFileformat, dicomFile, "John Snow"); //改写病人的名称为John Snow
ReadPatientName(dicomFileformat, dicomFile);
system("pause");
return 0;
}
- 运行并查看输出
正确输出病人姓名,至此已成功编译DCMTK库
感谢以下大佬,避免自己走了很多坑
https://blog.csdn.net/weixin_42089190/article/details/117440207
https://www.jianshu.com/p/b06349d609ba
https://www.bilibili.com/video/BV1m4411T728?from=search&seid=5091255401670271543&spm_id_from=333.337.0.0
DCMTK 3.6.2(MD支持库)与Microsoft Visual Studio 2017开发环境的搭建
https://blog.csdn.net/chaoenhu/article/details/78200274