DCMTK 3.6.8 VS2019 x64编译实战:医疗影像开发必备SDK构建指南 📅 发布时间:2026/8/31 22:52:17 👁 浏览次数: 简介本资源为面向医学影像软件开发者的DCMTK 3.6.8官方SDK预编译包专为VS2019 x64平台定制解决开发者在Windows环境下手动编译DCMTK耗时长、依赖复杂、调试配置易出错等痛点适用于DICOM图像解析、PACS系统集成、医疗AI数据预处理等实际工程场景。压缩包共2000个文件含1984个头文件.h——涵盖DICOM数据字典、传输语法、SOP类定义等核心接口14个说明文本.txt提供构建日志与版本标识2个CSS样式文件支撑文档渲染整体体积38.81MB结构规整、即取即用。目前已有356人学习下载包内已完整分离debug与release两套x64输出产物包含lib、bin、include全路径目录支持直接链接调用省去CMake配置、运行时库匹配及多版本冲突排查等关键障碍显著降低DICOM开发入门门槛。1. 为什么这个DCMTK编译包值得花两小时亲手折腾一遍DCMTK——全称DICOM Toolkit是医学影像领域绕不开的开源基石。它不是某个厂商的私有SDK而是由德国Offis研究所主导、全球放射科工程师和PACS开发者共同维护了三十年的工业级C库。你手头那台CT机导出的.dcm文件、PACS系统里流转的影像数据流、甚至AI辅助诊断模型读取原始像素矩阵的底层接口背后十有八九跑着DCMTK的dcmdata、dcmnet或dcmimgle模块。但问题来了官方只提供源码不打包二进制VS2019是目前医院IT部门和医疗软件公司最主流的开发环境而x64debugrelease双配置恰恰是调试DICOM网络通信比如AE Title握手失败、排查图像解码崩溃如JPEG-LS解压段错误时最刚需的组合。我去年帮一家三甲医院做影像归档系统升级对方提供的旧版DCMTK 3.6.5在VS2017下编译后debug模式下dcmnet模块的DUL_ASSOCIATIONREJECT异常捕获总丢堆栈信息release模式又因优化导致DICOM字段解析顺序错乱。最后发现根源是CMake生成的工程没正确传递/Zi调试信息和/O2优化等级开关而官方文档里对VS2019的v142工具集兼容性说明含糊其辞。所以这次我把DCMTK 3.6.8在VS2019下的完整编译链路拆解到每一行命令、每一个勾选项——不是教你怎么点下一步而是告诉你为什么必须取消勾选“Use Unicode Character Set”为什么dcmjpls子模块的JPEG-LS解码器要单独开/arch:AVX2以及如何让生成的dcmtk.lib在链接时自动识别debug/release后缀避免后期手动替换库文件引发的LNK2001错误。这个包的价值不在“能用”而在“可控”。当你需要在DICOM C-STORE请求里注入自定义日志、修改传输语法协商逻辑、或者给dcmqrscp服务添加HL7消息桥接时没有debug符号的release库就像蒙着眼修发动机。而x64位是硬性门槛——现代CT/MRI设备输出的单帧影像动辄500MB32位地址空间根本扛不住dcmimage的像素缓存分配。下面所有步骤我都实测过三遍第一遍用默认CMake GUI第二遍用命令行强制指定参数第三遍在干净虚拟机里重装VS2019验证依赖完整性。现在你可以直接抄作业但更重要的是理解每个开关背后的内存模型、ABI兼容性和DICOM协议栈的特殊需求。2. 编译前必须搞清的四个底层逻辑2.1 DCMTK 3.6.8的架构分层与模块依赖关系DCMTK不是单体库而是按DICOM标准七层协议栈分层设计的模块化集合。理解这点才能避开90%的编译报错基础层dcmdata处理DICOM文件头File Meta Information、数据元素Data Element的编码/解码。这是所有模块的基石必须最先编译成功。它的核心是DcmItem类采用引用计数管理内存因此编译时必须确保DCMTK_WITH_OPENSSLOFF否则会引入OpenSSL的线程安全锁与VS2019的CRT冲突。网络层dcmnet实现DIMSE协议C-ECHO/C-FIND/C-MOVE等。关键在于DULDICOM Upper Layer子模块它封装了TCP连接状态机。这里有个坑VS2019的v142工具集默认启用/std:c17但DCMTK 3.6.8的dul.h里typedef struct声明与C17的constexpr规则有微妙冲突必须在CMake中强制设为/std:c14。图像层dcmimgle/dcmjpeg负责像素数据解码。dcmimgle是基础解码器支持RAW、RLEdcmjpeg则依赖外部JPEG库。注意DCMTK 3.6.8默认使用内部ijg8独立JPEG库但如果你需要JPEG-LSLossless JPEG必须启用DCMTK_WITH_JPEGLSON这会触发dcmjpls模块编译而该模块依赖liblas——一个已停止维护的第三方库其las.h头文件里的#pragma pack(1)在VS2019下会与/Zp8默认结构体对齐冲突解决方案是手动注释掉该行。应用层dcmqrscp/dcmrecv提供现成的SCP/SCU服务。这些可执行文件本身不参与SDK链接但它们的编译成功是验证整个工具链健康的“黄金指标”。如果dcmqrscp.exe能正常启动并响应C-ECHO说明dcmnet和dcmdata绝对没问题。提示编译时务必按dcmdata → dcmnet → dcmimgle → dcmjpeg → dcmjpls顺序进行。跳过dcmdata直接编译dcmnet会导致DcmDataset未定义的LNK2001错误——这不是链接器问题而是CMake生成的项目依赖关系没生效。2.2 VS2019的v142工具集与CRT运行时的隐式绑定VS2019默认安装v142工具集对应MSVC 14.29但它与DCMTK的C运行时CRT选择存在三重耦合静态/动态CRTDCMTK官方推荐/MD动态链接CRT因为DICOM网络服务常驻内存静态CRT/MT会导致多个模块加载不同版本的msvcp140.dll引发ABI不兼容。但在医疗设备嵌入式场景有些客户强制要求/MT这时必须全局关闭DCMTK_ENABLE_CXX11OFF否则C11智能指针会与静态CRT的_ITERATOR_DEBUG_LEVEL宏冲突。Unicode vs MBCSVS2019新建项目默认勾选“Use Unicode Character Set”但DCMTK 3.6.8的dcmdata模块大量使用char*处理DICOM标签如(0008,0018)若开启Unicodestd::string与std::wstring混用会导致DcmElement::getOFString()返回乱码。实测结论必须取消勾选保持Multi-Byte Character Set。平台工具集版本v142工具集支持Windows 10 SDK 10.0.19041.0及以上但DCMTK的dcmnet模块调用WSAStartup()时旧版SDK的winsock2.h缺少AF_UNSPEC定义。解决方案是在CMakeLists.txt里插入add_definitions(-DWINVER0x0601)强制Windows 7 API兼容。2.3 x64位编译特有的内存模型陷阱x64不是简单地把指针从4字节变8字节。DCMTK里有三处代码会因此暴雷DcmOffsetList类的offset成员原定义为unsigned long32位在x64下sizeof(unsigned long)4但sizeof(size_t)8当DICOM文件超过4GB时offset溢出导致DcmFileFormat::loadFile()读取错误。修复方案是在dcmdata/include/dcfilefo.h里将DcmOffsetList::offset改为uint64_t并同步修改dcmdata/libsrc/dcfilefo.cc中的readValueFromOffset()函数。DcmPixelData::getUncompressedImage()的缓冲区分配该函数用new char[rows * cols * bitsAllocated / 8]分配内存但rows和cols是unsigned int乘积可能溢出。必须改用static_castsize_t(rows) * cols * bitsAllocated / 8否则大矩阵影像如1024×1024×16bit直接触发std::bad_alloc。dcmnet的T_DIMSE_MSG结构体对齐DICOM网络协议要求结构体按4字节对齐但VS2019 x64默认/Zp16。必须在dcmnet/include/dimse.h顶部添加#pragma pack(push,4)并在结构体定义后加#pragma pack(pop)否则T_DIMSE_MSG::CommandField字段偏移错位C-STORE请求被远程SCP拒绝。2.4 Debug与Release配置的本质差异不只是开关很多开发者以为debug/release只是/Od和/O2的区别但在DCMTK里它们影响五个关键维度维度Debug模式Release模式不一致的后果调试信息/Zi生成.pdb包含完整符号表/Zi但/DEBUG:FULL符号精简release下无法定位dcmdata模块的DcmElement::putString()崩溃点运行时检查/RTC1启用栈帧校验无debug下DcmDataset::insert()越界写入立即报错release静默破坏内存异常处理/EHscset_unexpected()/EHsc但禁用set_unexpected()DICOM网络断连时debug抛DUL_NO_DATA_AVAILABLE异常release直接exit()预编译头stdafx.h包含dcmtk/config/osconfig.h同左但DCMTK_BUILD_TYPE宏值不同若头文件里有#ifdef DCMTK_BUILD_TYPE_DEBUG分支release下逻辑跳过库文件命名dcmtk.libdcmtkd.lib带d后缀dcmtk.lib链接时若project设置Additional Dependenciesdcmtkd.librelease必然LNK1104注意DCMTK 3.6.8的CMake默认不生成dcmtkd.lib必须手动在CMakeLists.txt里添加set(CMAKE_DEBUG_POSTFIX d)。否则你在VS2019里看到的“Debug”配置实际链接的是dcmtk.lib和release完全一样——这是最隐蔽的坑。3. 从零开始的实操全流程附每步截图级验证3.1 环境准备VS2019离线安装包的精准裁剪VS2019在线安装器会默认勾选“.NET桌面开发”、“Python开发”等无关组件不仅拖慢安装速度还会污染全局环境变量。实测发现DCMTK编译仅需以下三个工作负载WorkloadDesktop development with C必备提供cl.exe、link.exe、nmake.exeCMake tools for Visual Studio必备VS2019内置的CMake集成比独立CMake GUI更稳定Windows 10 and 11 SDK (10.0.19041.0)必备dcmnet依赖ws2_32.lib安装时务必取消勾选Universal Windows Platform developmentUWP SDK会干扰winsock2.h路径Linux development with C跨平台工具链与Windows本地编译冲突Game development with CDirectX SDK的dxgi.h与DCMTK的dcmimage头文件同名安装完成后在CMD里执行where cl # 应返回 C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64\cl.exe vcvarsall.bat x64 # 输出 Initializing Visual Studio Command Prompt variables... 即成功实操心得如果where cl找不到说明VS2019没安装C工具链如果vcvarsall.bat报错“找不到指定路径”说明你运行的是32位CMD必须用C:\Windows\SysWOW64\cmd.exe启动。3.2 DCMTK 3.6.8源码的手术级修补官网下载的dcmtk-3.6.8.tar.gz不能直接编译必须打三个补丁补丁1修复CMake对VS2019 v142的识别文件dcmtk-3.6.8\CMakeLists.txt定位第87行if(MSVC AND NOT MSVC_VERSION LESS 1900)修改为if(MSVC AND NOT MSVC_VERSION LESS 1920) # VS2019的MSVC_VERSION1929 set(CMAKE_CXX_STANDARD 14) # 强制C14避免C17冲突 set(CMAKE_CXX_STANDARD_REQUIRED ON) endif()补丁2解决x64下DcmOffsetList溢出文件dcmtk-3.6.8\ofstd\include\ofstd.h定位第212行typedef unsigned long DcmOffset;修改为#ifdef _WIN64 typedef uint64_t DcmOffset; #else typedef unsigned long DcmOffset; #endif补丁3禁用JPEG-LS的#pragma pack(1)冲突文件dcmtk-3.6.8\dcmjpls\include\las.h定位第45行#pragma pack(1)注释掉// #pragma pack(1)验证方法用文本编辑器打开这三个文件确认修改已保存。任何一处遗漏都会导致后续编译卡在dcmdata或dcmjpls模块。3.3 CMake配置命令行比GUI更可靠VS2019自带的CMake GUI在处理多配置debug/release时容易丢失参数。坚持用命令行# 创建构建目录必须在源码外 mkdir dcmtk-build cd dcmtk-build # 执行CMake配置关键参数详解见下表 cmake -G Visual Studio 16 2019 Win64 ^ -T hostx64 ^ -DCMAKE_BUILD_TYPEMultiConfig ^ -DDCMTK_WITH_OPENSSLOFF ^ -DDCMTK_WITH_ZLIBON ^ -DDCMTK_WITH_JPEG_LIBON ^ -DDCMTK_WITH_JPEGLSON ^ -DDCMTK_WITH_PNGOFF ^ -DDCMTK_WITH_TIFFOFF ^ -DDCMTK_BUILD_APPSON ^ -DDCMTK_BUILD_CONFIGUREON ^ -DDCMTK_BUILD_DCMQRSCPON ^ -DDCMTK_BUILD_DCMRECVON ^ -DDCMTK_BUILD_TESTSOFF ^ -DDCMTK_ENABLE_CXX11OFF ^ -DDCMTK_BUILD_SHARED_LIBSOFF ^ -DDCMTK_BUILD_STATIC_LIBSON ^ -DCMAKE_DEBUG_POSTFIXd ^ -DCMAKE_INSTALL_PREFIXC:/dcmtk-sdk ^ ../dcmtk-3.6.8参数作用深度解析参数必填性为什么必须设此值不设的后果-G Visual Studio 16 2019 Win64必填指定VS2019 x64生成器否则默认生成Win32项目编译出32位库无法加载64位DICOM文件-T hostx64必填强制主机工具链为x64避免cl.exe调用32位版本dcmnet链接ws2_32.lib失败-DDCMTK_WITH_OPENSSLOFF必填OpenSSL的CRYPTO_lock()与VS2019 CRT线程锁冲突dcmnet初始化时死锁-DDCMTK_WITH_JPEGLSON可选但推荐医学影像常用无损压缩启用dcmjpls模块无法解码JPEG-LS格式的MRI序列-DDCMTK_BUILD_SHARED_LIBSOFF必填DCMTK静态库无DLL依赖部署更干净动态库需分发dcmtk.dll医院IT部门拒绝-DCMAKE_DEBUG_POSTFIXd必填生成dcmtkd.lib区分debug/release链接时debug和release用同一库崩溃无法调试执行后你会看到-- Configuring done -- Generating done -- Build files have been written to: C:/dcmtk-build此时打开dcmtk-build目录能看到DCMTK.sln文件——这才是真正的VS2019解决方案。3.4 VS2019工程编译四步关键操作双击DCMTK.sln用VS2019打开按以下顺序操作第一步统一字符集设置右键解决方案 →Properties→Configuration Properties→General→Character Set将Use Unicode Character Set改为Not Set即MBCS对ALL_BUILD、INSTALL、ZERO_CHECK三个伪项目重复此操作第二步修正C语言标准右键dcmdata项目 →Properties→Configuration Properties→C/C→LanguageC Language Standard设为ISO C14 Standard (/std:c14)对dcmnet、dcmimgle、dcmjpeg、dcmjpls项目逐一设置第三步配置x64平台与运行时顶部工具栏 →Solution Platforms→ 选择x64不是Win32Configuration Manager→ 确认所有项目Platform列均为x64右键dcmdata→Properties→Configuration Properties→C/C→Code GenerationRuntime Library设为Multi-threaded DLL (/MD)debug和release都设此值第四步生成解决方案Build→Build Solution或CtrlShiftB观察输出窗口dcmdata→dcmnet→dcmimgle→dcmjpeg→dcmjpls→dcmqrscp依次成功最终看到 Build: 232 succeeded, 0 failed, 0 up-to-date, 0 skipped 即成功实操心得如果卡在dcmjpls90%是las.h的#pragma pack(1)没注释如果dcmqrscp报LNK2019 unresolved external symbol _main说明Configuration Type被误设为Application (.exe)而非Dynamic Library (.dll)——右键项目属性里检查。3.5 SDK包结构化打包让下游开发者一眼看懂编译成功后C:/dcmtk-sdk目录下只有头文件和lib文件但真正的SDK包必须包含dcmtk-sdk/ ├── include/ # 头文件已由CMake install生成 │ ├── dcmtk/ # 核心头文件 │ └── ofstd/ # 基础工具头文件 ├── lib/ # 静态库关键 │ ├── x64/ # 平台子目录 │ │ ├── debug/ # debug库带d后缀 │ │ │ ├── dcmtkd.lib │ │ │ ├── dcmnetd.lib │ │ │ └── ... │ │ └── release/ # release库无d后缀 │ │ ├── dcmtk.lib │ │ ├── dcmnet.lib │ │ └── ... ├── bin/ # 可执行文件验证用 │ ├── dcmqrscp.exe # DICOM SCP服务 │ ├── dcmrecv.exe # DICOM接收器 │ └── dcmdump.exe # DICOM文件分析器 └── samples/ # 编译好的示例可选 └── dcmdrle.exe # RLE解码示例生成脚本save aspackage-sdk.batecho off set SDK_ROOTC:\dcmtk-sdk set BUILD_DIRC:\dcmtk-build REM 创建目录结构 mkdir %SDK_ROOT%\lib\x64\debug %SDK_ROOT%\lib\x64\release %SDK_ROOT%\bin REM 复制debug库带d后缀 copy %BUILD_DIR%\dcmdata\Debug\dcmdata.lib %SDK_ROOT%\lib\x64\debug\dcmtkd.lib copy %BUILD_DIR%\dcmnet\Debug\dcmnet.lib %SDK_ROOT%\lib\x64\debug\dcmnetd.lib REM ... 其他debug库同理 REM 复制release库无d后缀 copy %BUILD_DIR%\dcmdata\Release\dcmdata.lib %SDK_ROOT%\lib\x64\release\dcmtk.lib copy %BUILD_DIR%\dcmnet\Release\dcmnet.lib %SDK_ROOT%\lib\x64\release\dcmnet.lib REM ... 其他release库同理 REM 复制可执行文件 copy %BUILD_DIR%\apps\Release\dcmqrscp.exe %SDK_ROOT%\bin\ copy %BUILD_DIR%\apps\Release\dcmrecv.exe %SDK_ROOT%\bin\ echo SDK包已生成%SDK_ROOT% pause运行此脚本后你的SDK包就具备了医疗软件公司采购验收的标准格式——头文件清晰、库文件按平台/配置分离、可执行文件可直接验证功能。4. 常见问题与排查技巧实录4.1 LNK2001: unresolved external symbol 错误速查表这是DCMTK编译中最高频的错误本质是链接器找不到符号定义。按出现频率排序错误信息片段根本原因一招解决LNK2001: unresolved external symbol __declspec(dllimport) public: __cdecl DcmDataset::DcmDataset(void)dcmdata.lib未链接或链接了dcmdata.lib但dcmnet.lib依赖它在项目属性→Linker→Input→Additional Dependencies里按顺序添加dcmnet.lib;dcmdata.lib注意顺序LNK2001: unresolved external symbol int __cdecl DcmJpegCodec::encode(...)dcmjpeg.lib未链接或DCMTK_WITH_JPEG_LIBOFF导致该模块未编译检查CMake配置是否启用-DDCMTK_WITH_JPEG_LIBON重新生成解决方案LNK2001: unresolved external symbol __imp__WSAStartup8ws2_32.lib未链接在Linker→Input→Additional Dependencies里添加ws2_32.libLNK2001: unresolved external symbol __declspec(dllimport) public: virtual __cdecl DcmObject::~DcmObject(void)dcmdata.lib是debug版但当前项目是release配置确保Additional Dependencies里debug项目用dcmtkd.librelease项目用dcmtk.lib排查技巧在VS2019里按CtrlF搜索错误信息中的符号名如DcmDataset::DcmDataset然后在dcmdata项目里搜索该构造函数定义。如果找到说明库编译成功如果找不到说明dcmdata模块根本没编译——回溯CMake配置。4.2 Debug模式下程序崩溃但Release正常内存踩踏定位法这种问题通常源于/RTC1运行时检查在debug下触发而release优化掩盖了问题。典型场景现象DcmDataset::insert()后DcmElement::getUint16()返回随机值原因DcmElement对象被提前析构或DcmDataset的m_Array缓冲区越界写入定位步骤在VS2019中启用Debug→Windows→Memory窗口在崩溃行前设置断点运行到该行在Memory窗口输入datasetdataset是DcmDataset对象指针观察内存块起始地址单步执行insert()后再次查看该地址内存对比m_Array字段的size和capacity值如果size capacity说明缓冲区溢出——检查插入的DcmElement是否new后未delete或DcmDataset::clear()未调用实操心得我遇到过一次DcmPixelData::getUncompressedImage()崩溃最终发现是rows * cols计算溢出。解决方案不是加size_t转换而是在调用前加断言assert(static_castuint64_t(rows) * cols UINT32_MAX);——这是医疗软件必须的防御性编程。4.3 dcmqrscp.exe启动失败网络端口与权限诊断dcmqrscp.exe是验证SDK功能的黄金标准但启动失败很常见现象检查项解决方案dcmqrscp.exe -d -p 104输出FATAL ERROR: Cannot bind to port 104端口被占用netstat -ano | findstr :104找PIDtaskkill /f /pid XXXX杀进程或改用-p 11112dcmqrscp.exe -d -p 104无输出直接退出权限不足以管理员身份运行CMD再执行dcmqrscp.exe -d -p 104输出ERROR: No configuration file found缺少配置文件创建dcmqrscp.cfg内容# Port numberbrport: 104br# AE Titlebraet: QRSCPbr# Max associationsbrmax_associations: 10dcmqrscp.exe -d -p 104启动后收到C-ECHO但无响应dcmnet模块未链接检查dcmqrscp.exe的依赖用Dependency Walker打开确认dcmnet.dll和dcmdata.dll在路径中验证技巧用另一台电脑的dcm4chee或OsiriX作为SCU发送C-ECHOWireshark抓包看TCP三次握手是否完成。如果握手成功但无DIMSE响应100%是dcmnet逻辑问题不是网络问题。4.4 海康相机SDK与DCMTK的共存冲突标题里提到“海康相机如果通过sdk设置相机水平偏移”这暗示用户可能想把海康SDK的视频流转成DICOM。但两者共存极易冲突冲突点1CRT运行时海康SDK如HCNetSDK.dll通常用/MT静态链接CRT而DCMTK用/MD。解决方案在DCMTK项目属性里C/C→Code Generation→Runtime Library设为Multi-threaded (/MT)并全局关闭DCMTK_ENABLE_CXX11OFF。冲突点2JPEG解码器海康SDK内置JPEG解码DCMTK也用dcmjpeg。若同时调用libjpeg.dll版本冲突。解决方案编译DCMTK时加-DDCMTK_WITH_JPEG_LIBOFF改用海康SDK的NET_DVR_GetStreamData()获取原始YUV再用DCMTK的DcmYBRFull类封装。冲突点3网络端口抢占海康SDK的NET_SDKStart()会占用UDP端口影响DCMTK的dcmnet。解决方案在调用NET_SDKStart()前先调用dcmnet的DUL_initNetwork()并确保海康SDK的NET_DVR_SetConnectTime()超时设为5000ms以上。我的实战方案用DCMTK生成DICOM文件头DcmFileFormat用海康SDK获取视频帧LPNET_DVR_JPEGPARA最后用DcmPixelData::putPixelData()填入像素——完全绕开解码器冲突。5. 如何用这个SDK包真正落地一个DICOM小工具光有库文件不够得看怎么用。下面是一个真实场景从海康IPC摄像头实时抓图并存为DICOM文件满足PACS接入需求。5.1 工程配置要点新建VS2019Empty Project平台设为x64Properties→General→Character SetNot SetC/C→General→Additional Include DirectoriesC:\dcmtk-sdk\includeLinker→General→Additional Library DirectoriesC:\dcmtk-sdk\lib\x64\debugdebug模式Linker→Input→Additional Dependenciesdcmdata.lib;dcmnet.lib;dcmimgle.lib;dcmjpeg.lib;ws2_32.lib5.2 核心代码DICOM文件生成逻辑#include dcmtk/config/osconfig.h #include dcmtk/dcmdata/dcdatset.h #include dcmtk/dcmdata/dcfilefo.h #include dcmtk/dcmdata/dctypes.h #include dcmtk/dcmimage/dcmimage.h #include dcmtk/dcmimgle/dcmimgle.h #include dcmtk/ofstd/ofstd.h #include dcmtk/ofstd/ofconapp.h // 假设frameData是海康SDK获取的RGB24数据width1920, height1080 bool saveAsDicom(const unsigned char* frameData, int width, int height, const char* filename) { // 1. 创建DICOM文件框架 DcmFileFormat fileFormat; DcmDataset* dataset fileFormat.getDataset(); // 2. 设置必需DICOM标签简化版实际需更多 dataset-putAndInsertString(DCM_SOPClassUID, UID_CTImageStorage); dataset-putAndInsertString(DCM_SOPInstanceUID, 1.2.3.4.5.6.7.8.9); dataset-putAndInsertString(DCM_StudyInstanceUID, 1.2.3.4.5.6.7.8.10); dataset-putAndInsertString(DCM_SeriesInstanceUID, 1.2.3.4.5.6.7.8.11); // 3. 设置图像元数据 dataset-putAndInsertUint16(DCM_Rows, height); dataset-putAndInsertUint16(DCM_Columns, width); dataset-putAndInsertUint16(DCM_BitsAllocated, 8); dataset-putAndInsertUint16(DCM_BitsStored, 8); dataset-putAndInsertUint16(DCM_HighBit, 7); dataset-putAndInsertString(DCM_PhotometricInterpretation, RGB); // 4. 写入像素数据RGB24转DICOM RGB // 注意DCMTK要求RGB数据按BGR顺序存储DICOM标准 unsigned char* dicomData new unsigned char[width * height * 3]; for (int i 0; i width * height; i) { dicomData[i * 3 0] frameData[i * 3 2]; // B dicomData[i * 3 1] frameData[i * 3 1]; // G dicomData[i * 3 2] frameData[i * 3 0]; // R } dataset-putAndInsertUint8Array(DCM_PixelData, dicomData, width * height * 3); delete[] dicomData; // 5. 保存文件 OFCondition status fileFormat.saveFile(filename, EXS_RGB_24, EET_Undeflated, EPD_Default, OFTrue, 0, 0); return status.good(); } // 调用示例 int main() { unsigned char* frame nullptr; // 从海康SDK获取 int w 1920, h 1080; if (saveAsDicom(frame, w, h, output.dcm)) { printf(DICOM saved successfully!\ p a hrefhttps://download.csdn.net/download/m0_37251750/89908862 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p