1. 下载DCMTK的源文件包和支持库
首先下载dcmtk软件包,此处我们下载源码和支持库来进行自己编译。下载网址:
https://dicom.offis.de/en/dcmtk/dcmtk-software-development/
如图所示,选择合适的版本进行下载,此处采用VS2019进行编译。
2. 解压文件包和支持库
对下载的dcmtk软件包和支持库进行解压。
在dcmtk软件包中新建build和sdk文件夹,以便后续进行cmake编译。
3. cmake配置
下面对cmake进行配置,选择合适的路径文件夹以后,参照图中选项进行配置设置。
取消勾选DCMTK_OVERWRITE_WIN32_COMPILER_FLAGS
此处用到了下载的二进制支持包文件。
点击config按钮,等待完成后,再点击Generate按钮生成VS工程项目。
4.编译DCMTK库
点击Open project 按钮打开VS项目工程,然后先选择 ALL_BUILD进行生成,随后选择INSTALL进行sdk整理。
如果遇到“文件中有常量”的错误提醒,可以用记事本打开对应的.cc文件,另存为“utf8-BOM”格式即可,毕竟这是VS支持的文件格式。
编译完成后,生成下面的SDK包。
5.示例项目
下面我们验证一下编译的SDK包是否可用。
5.1 下载Dicom示例文件
先下载所需要的Dicom文件,下载网址:https://www.dicomlibrary.com/,
在左侧DICOM Samlples任意选择一个图片进去,然后点击上面的Export——Download按钮。
对下载的文件进行解压后,如下所示:
5.2 创建vs项目并进行属性设置
新建一个VS控制台程序,然后进行sdk设置:
依赖项:
iphlpapi.lib
ws2_32.lib
wsock32.lib
netapi32.lib
ofstd.lib
oflog.lib
dcmdata.lib
zlib_d.lib
5.3 运行效果
编译生成后如下,把需要的几个dll拷贝过来。
5.4 源码
// DCMTKTest.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <dcmtk/config/osconfig.h>
#include <dcmtk/dcmdata/dctk.h>
//读DICOM文件中的病人名
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 << "Read PatientName:" << PatientName << std::endl;
}
else
{
std::cout << "Read PatientName Error:" << status.text() << std::endl;
return false;
}
return true;
}
//修改保存DICOM文件中的病人名
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 = "F:\\Qt_vtk_itk\\series-00000\\image-00000.dcm";
ReadPatientName(dicomFileformat, dicomFile); //读写病人的名称
SavePatientName(dicomFileformat, dicomFile, "Lebron Wade"); //改写病人的名称为John Snow
ReadPatientName(dicomFileformat, dicomFile);
system("pause");
return 0;
}