DICOM的C++支持库-DCMTK的编译和配置

视频教程:https://www.bilibili.com/video/av55027364

1.下载源文件和支持库


下载DCMTK源文件包并解压

下载支持库包并解压


2.构建和编译DCMTK工程(CMake+VS2015)


- 下载CMake并安装

- 使用CMake构建工程

  • 关闭所有和VS有关的程序,然后打开CMake-gui
  • 设置sourcode路径,就是DCMTK包解压后的路径
  • 设置构建出来的DCMTK工程的存放路径
  • 勾选Grouped和Advanced
  • 点击Conifigue,在打开的窗口里选择相应的VS版本(这里为Visual Studio 14 2015 Win64),点击Finish
  • 等待设置完成后,界面出现设置选项,进行设置

BUILD组设置如图

DCMTK组和WITH组设置如图

CMAKE组,保持默认即可,如果C盘只有管理员权限,则可以将CMAKE_INSTALL_PREFIX设置为其他路径(后续修改工程的CMake文件也可以),这个设置就是下一步DCMTK工程编译出来的一系列文件的存放路径

DOXYGEN组,ICU组下默认设置

  • 再次点击Configure,等待进一步设置完成,再点击Generate,生成工程后就可以点击Open Project打开工程了

- 检查工程属性

  • 打开VS2015的Solution Explorer,查看任一工程的属性,查看以下工程选项(如何都满足,表示DCMTK工程构建成功)
    • 字符集是否设置为多字节字符集
    • 运行库是否为MDd和MD

- 编译DCMTK工程

  • 打开VS2015的batch build对话框,在ALL_BUILD里勾选Debug和Release,点击Build,编译完成后会在工程bin目录下生成exe和dll,lib目录下生成lib
  • 打开batch build对话框,在INSTALL里勾选你想配置的install版本(Debug或Release)
  • 点击Build,会将相应的文件拷贝到最初在CMake里设置的CMAKE_INSTALL_PREFIX的路径下
    • bin目录里为exe和dll
    • include目录为头文件
    • lib目录下生成lib
  • 重要:将支持库包里的zlib_d.lib拷贝到生成的lib目录下(如果是区别Debug库和Release库,则应该拷贝这两个不同的文件,都改名为zlib.lib,然后在附加库配置上填写zlib.lib)


3. 编码验证DCMTK库


- 建立Windows控制台工程并配置

  • 配置include目录和lib目录
  • 配置依赖库
  • 将DCMTK的bin目录下的ofstd.dll,oflog.dll,dcmdata.dll拷贝到工程的exe程序同目录下
image34.png

- 编写测试代码

// C++_Dicom_Sample.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#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;

    std::string dicomFile = "E:\\Learning\\C++\\Sample\\C++_Dicom_Sample\\x64\\Debug\\CT-MONO2-16-chest.dcm";

    ReadPatientName(dicomFileformat, dicomFile);

    SavePatientName(dicomFileformat, dicomFile, "John Snow");

    ReadPatientName(dicomFileformat, dicomFile);

    system("pause");

    return 0;
}

- 下载可供使用的Dicom文件

http://www.barre.nom.fr/medical/samples/

下载所需要的Dicom文件,并把文件路径修改在代码中

- 运行并查看输出

正确输出病人姓名,至此已成功编译DCMTK库

推荐阅读更多精彩内容