VS2019+DCMTK3.6.6环境配置

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 查看本文章
  • 勾选GroupedAdvanced
    在这里插入图片描述

  • 点击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.dlloflog.dlldcmdata.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

猜你喜欢

转载自blog.csdn.net/qq_45445740/article/details/121538759