VS2019+DCMTK3.6.6环境配置
DCMTK是一个比较优秀的支持DICOM文件读写的C++版本第三方库。
目录
- 1.下载DCMTK的源文件包和支持库
- 2.使用Cmake构建DCMTK工程
- 2.1 CMake下载
- 2.2 使用CMake构建工程
- 2.3 检查工程属性
- 3.编译DCMTK库
- 4.编写测试用例验证DCMTK库
- 4.1 VS环境配置
- 4.2 编写测试代码
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)
勾选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 SnowReadPatientName(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
VS2019+DCMTK3.6.6环境配置相关推荐
- VS2019之wpf开发环境配置(非常详细)
vs2019之c#桌面程序wpf开发环境的配置 之前一直在用vs2019+qt来开发程序,但是最近看同事用了.net开发了一个小程序,感觉.net也挺好用,而且不需要安装和配置qt,所以给大家介绍一下 ...
- VS2019+OpenCV4.5.1 环境配置+一劳永逸法(附下载地址)
准备工作: 系统安装: 1.Visual Studio 2019(VS2019) 2.OpenCV4.5.1(下载地址:OpenCV各个版本下载) 一.系统环境变量 1.桌面右键单击[我的电脑]-&g ...
- VS2019 windows驱动开发环境配置
配置Windows驱动开发环境 VS2019 下载VS2019 下载链接 https://visualstudio.microsoft.com/zh-hans/downloads/ 选择你所需要的开发 ...
- dcmtk医学图像处理教程(一)环境配置VS2019+dcmtk3.6.6
开发环境: 文章目录 0 前言 为什么使用visual studio? 如何安装? 其他一些可参考资料,实在觉得本文无法满足需求,可以查看 1 下载dcmtk源代码 1.2 下载文件时不同参数的比较 ...
- V_rep与vs2019开发环境配置
V_rep与vs2019开发环境配置 V_rep编译生成所需文件 编译文件 添加环境变量 建立VS2019项目工程并配置 V_rep配置及示例代码 前提是安装好V_rep和vs2019,本文仅讲解如何 ...
- 最新CUDA环境配置(Win10 + CUDA 11.6 + VS2019)
最新CUDA环境配置(Win10 + CUDA 11.6 + VS2019) 本篇博客根据NVIDIA 官方文档所述, 并根据自己实践得出. 供各位需要的朋友参考. 1.前言 本篇文章的软件环境为: ...
- vs2019使用openssl3.0的环境配置并进行DES加解密
vs2019使用openssl3.0的环境配置并进行DES加/解密 1.环境配置 (1)在电脑上安装好vs2019,openssl3.0 (2)打开vs2019按一下步骤进行配置 右击项目--属性-- ...
- 九七的Windows内核驱动开发 WIN10-2004+VS2019+WDK驱动开发环境安装及配置
WIN10-2004+VS2019+WDK驱动开发环境安装及配置 一.定义介绍 本节介绍如何在Windows10系统(2004版本,操作步骤中有如何查看版本)中安装VS2019及WDK开发包,并进 ...
- Fluent UDF编译环境配置 VS2019
Fluent UDF编译环境配置 VS2019 环境配置 问题记录 继续记录调试过程 仅用一个host 仅用一个node 两个都放进去 换个电脑继续报错 记录错误 环境配置 生成PATH文件的,有的没 ...
- 【SLAM】SLAM环境配置 Win10+VS2019+OpenCV+PCL+g2o+Vcpkg
目录 SLAM环境配置 Win10+VS2019+OpenCV+PCL+g2o+vcpkg 软件及版本 1. Windows 10 2. Visual Studio 2019 3. OpenCV 4. ...
最新文章
- WPF的消息机制(二)- WPF内部的5个窗口之隐藏消息窗口
- 前端编程之jQuery
- js 数组移除_JS某些封装方法
- 汉字转换成拼音的代码(asp版)
- Windows判断是否为64位程序(C++)
- 如何在Linux系统上刷抖音
- Mac 10.12安装迅雷2.7.2
- 电商促销后台设计,写得太好了!
- 类库从自带的配置文件中获取信息(DLL文件 获取 DLL文件自带的配置信息) z...
- R语言怎么导入表格画图_立创EDA画图不求人18 | 视频教程 | 原理图横向纵向切换...
- 二级域名间相互请求 ajax跨域请求
- 唤客猫SCRM功能详解(二)
- 先尝甜头后食苦果 曾经的光伏巨头如今都身在何方?
- python中re.search()函数的用法
- 换个方式认识一下——微信公众号搜索公众号列表 API
- 倾斜摄影数据转cesium 3dtile(详细步骤)
- java对焦_Android camera摄像头对焦,zoom的通知事件回调,告诉java应用层已经对焦完成...
- 国产ARM核心工控主板介绍
- 顶峰Android手机视频转换器,凡人Android手机视频转换器
- ArcMap 制图出图
热门文章
- JUnit 4 超详细教程(一)
- android 测试手机屏幕,如何才能知道自己手机屏幕质量如何 安卓手机专业测屏神器体验...
- js加html连线实现流程,(jsPlumb开发入门教程实现html5拖拽连线.doc
- vue相关插件及框架全家桶
- pclint vc2012配置
- Windows电脑上最好的3个txt阅读器
- NEMA-0183(GPGGA,GPRMC,GPGSA,GPGSV,GPVTG)详解
- 使用ApiPost按顺序传参及测试多个接口
- php字符串长度获取_php哪个函数能取得字符串长度
- php 按指定长度分割字符串,php实现将字符串按照指定距离进行分割的方法