关于DCMTK使用

使用DCMTK读取DICOM图片的指南

由于赵老师要求读取DICOM图片,几经周折找到这个东东。

编译工作:下载其CMake版本,用CMake编译好。然后打开VS,在项目的属性设置里将C/C++->代码生成中的”运行时库“设为多线程调试DLL/MDd,以配合MFC、.NET等运行库。如过不改运行时库,默认的为多线程调试/MTd,仅能支持控制台应用程序或者静态库的MFC等。

 

使用:在VS下的用户应用程序中,添加DCMTK的include目录和lib目录。对于仅使用DICOMImage类读取DICOM图像数据,可使用头文件

#include "DCMTK\config\osconfig.h"
#include "dcmtk\dcmdata\dctk.h"
#include "DCMTK\dcmimgle\dcmimage.h"

链接库文件(注意先后顺序)

ofstd.lib
dcmdata.lib
netapi32.lib
wsock32.lib
dcmimgle.lib
dcmimage.lib

如遇到压缩型JPEG保存的DICOM图片,需使用DJDecoderRegistration::registerCodecs();注册解压算法,然后再读取DICOM图片就能读出来了。用完后用DJDecoderRegistration::cleanup();释放内存。注意用这个的时候需要
#include"dcmtk/dcmjpeg/djdecode.h"  
 #include"dcmtk/dcmjpeg/dipijpeg.h"   
2个头文件,以及
ijg8.lib
ijg12.lib
ijg16.lib
dcmjpeg.lib

4个lib

以上

### 如何通过 JNI 调用 DCMTK 示例代码及配置方法 JNI(Java Native Interface)允许 Java 代码调用本地代码,如 C 或 C++ 编写的库。DCMTK 是一个用于处理 DICOM 数据的开源工具包,通常以 C++ 编写。以下是如何通过 JNI 调用 DCMTK 的解决方案和示例代码。 #### 1. 环境准备 在使用 JNI 调用 DCMTK 之前,需要确保以下环境已正确设置: - 安装了支持 C++ 的编译器(如 GCC 或 MSVC)。 - 已下载并编译 DCMTK 库[^1]。 - 配置好 JDK 和 JNI 开发环境。 #### 2. 创建 Java 类 首先,在 Java 中定义一个类,并声明一个本地方法以供 JNI 调用。 ```java public class DicomLoader { // 声明本地方法 public native String loadDicom(String filePath); // 加载本地库 static { System.loadLibrary("dicom_loader"); } public static void main(String[] args) { DicomLoader loader = new DicomLoader(); String result = loader.loadDicom("example.dcm"); System.out.println("DICOM 文件信息: " + result); } } ``` #### 3. 生成头文件 使用 `javac` 编译上述 Java 文件后,运行以下命令生成 JNI 头文件: ```bash javah -jni DicomLoader ``` 这将生成一个名为 `DicomLoader.h` 的头文件,其中包含 JNI 方法的签名。 #### 4. 编写 C++ 实现 接下来,编写一个 C++ 文件实现该方法,并调用 DCMTK 的功能。 ```cpp #include <jni.h> #include "DicomLoader.h" #include "dcmtk/config/osconfig.h" // 包含 DCMTK 配置 #include "dcmtk/dcmdata/dctk.h" // 包含 DCMTK 核心库 extern "C" { JNIEXPORT jstring JNICALL Java_DicomLoader_loadDicom(JNIEnv *env, jobject obj, jstring filePath) { const char *path = env->GetStringUTFChars(filePath, nullptr); if (path == nullptr) return nullptr; DcmFileFormat fileformat; OFCondition status = fileformat.loadFile(path); // 使用 DCMTK 加载 DICOM 文件 if (status.bad()) { env->ReleaseStringUTFChars(filePath, path); return env->NewStringUTF("无法加载 DICOM 文件"); } DcmDataset *dataset = fileformat.getDataset(); if (dataset == nullptr) { env->ReleaseStringUTFChars(filePath, path); return env->NewStringUTF("数据集为空"); } char patientName[1024]; dataset->findAndGetOFStringArray(DCM_PatientName, patientName, 1024).good(); // 获取患者姓名 env->ReleaseStringUTFChars(filePath, path); return env->NewStringUTF(patientName); } } ``` #### 5. 编译本地库 将上述 C++ 文件编译为共享库。例如,在 Linux 上可以使用以下命令: ```bash g++ -shared -fPIC -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux \ -o libdicom_loader.so DicomLoader.cpp -ldcmdata -ldcmnet -ldcmimgle ``` 在 Windows 上,则可能需要使用类似以下命令: ```cmd cl /I"%JAVA_HOME%\include" /I"%JAVA_HOME%\include\win32" /LD DicomLoader.cpp /link dcmtk.lib ``` #### 6. 运行程序 确保共享库路径被添加到系统的动态库加载路径中(如 Linux 的 `LD_LIBRARY_PATH` 或 Windows 的系统 PATH)。然后运行 Java 程序即可。 --- ### 注意事项 - 确保 DCMTK 库已正确安装并链接到本地库中[^2]。 - 如果遇到符号未定义的问题,请检查是否正确链接了所有必要的 DCMTK 模块。 - 在多平台环境下,需注意 JNI 函数签名的兼容性问题。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值