当前位置: 首页 > news >正文

ubuntu20.04 Qt6引用dcmtk库实现dicom文件读取和字符集转换

1 环境问题

安装完Qt6,新建Qt/QtQuick CMake工程编译出现如下错误:

Found package configuration file: Qt6Config.cmake but it set Qt6 FOUND to FALSE so package "Qt6" is considered to be NOT FOUND.

原因:

这是因为系统中缺少OpenGL库,可以安装libgl1-mesa-dev

解决方法:

sudo apt install libgl1-mesa-dev

项目编译成功后运行,如果出现如下错误:

qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even through it was found.

sudo apt install libxcb-cursor*

2 引用dcmtk

由于作者使用cmake编译,所以需要使用CMakeLists添加第三方库的方式,来引用dcmtk库。

set(DCMTK_INC_DIR "/home/charles/workdir/software/dcmtk-3.6.8/dcmtk-3.6.8-release/include")
set(DCMTK_LIB_DIR "/home/charles/workdir/software/dcmtk-3.6.8/dcmtk-3.6.8-release/lib")
include_directories(${DCMTK_INC_DIR})
link_directories(${DCMTK_LIB_DIR})target_link_libraries(dcmtk-test PUBLICQt${QT_VERSION_MAJOR}::Widgets${DCMTK_LIB_DIR}/libdcmtk.so
)

3 测试程序

实现对dicom tag值的读取,以及字符集的转换。以支持中文或其他字符的显示

#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include <dcmtk/dcmdata/dctk.h>
#include <dcmtk/ofstd/ofchrenc.h>bool strEqual(const string s, const string s1)
{return (strcmp(s.c_str(), s1.c_str()) == 0);
}//参考https://dicom.nema.org/medical/dicom/current/output/chtml/part18/chapter_D.html
string getCodeName(const string &Ch)
{if (strEqual(Ch, "GB18030"))return "GB18030";else if (strEqual(Ch, "ISO_IR 192"))return "UTF-8";else if (strEqual(Ch, "ISO_IR 100"))return "ISO-8859-1";else if (strEqual(Ch, "ISO_IR 101"))return "ISO-8859-2";else if (strEqual(Ch, "ISO_IR 109"))return "ISO-8859-3";else if (strEqual(Ch, "ISO_IR 110"))return "ISO-8859-4";else if (strEqual(Ch, "ISO_IR 144"))return "ISO-8859-5";else if (strEqual(Ch, "ISO_IR 127"))return "ISO-8859-6";else if (strEqual(Ch, "ISO_IR 126"))return "ISO-8859-7";else if (strEqual(Ch, "ISO_IR 138"))return "ISO-8859-8";else if (strEqual(Ch, "ISO_IR 148"))return "ISO-8859-9";else if (strEqual(Ch, "ISO_IR 203"))return "ISO-8859-15";else if (strEqual(Ch, "ISO_IR 166"))return "TIS-620";else if (strEqual(Ch, "ISO 2022 IR 13") || strEqual(Ch, "ISO 2022 IR 87"))return "ISO-2022-JP";else if (strEqual(Ch, "ISO 2022 IR 6")|| strEqual(Ch, "ISO 2022 IR 149"))return "ISO-2022-KR";else if (strEqual(Ch, "ISO 2022 IR 6")|| strEqual(Ch, "ISO 2022 IR 58"))return "ISO-2022-CN";else if (strEqual(Ch, "GBK"))return "GBK";elsereturn "";
}OFString toUTF8(OFString &curEncoding,OFString &valStr)
{OFCharacterEncoding encoding;OFCondition res = encoding.selectEncoding(getCodeName(curEncoding.c_str()).c_str(), OFString("UTF-8"));OFString toString("");res = encoding.convertString(valStr, toString);return toString;
}MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);loadDcm();}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::loadDcm()
{DcmFileFormat fileformat;OFCondition status = fileformat.loadFile("./test.dcm");if (status.good()){OFString str;OFString charset("GB18030");if (fileformat.getDataset()->findAndGetOFString(DCM_SpecificCharacterSet, str).good()){charset = str;ui->textEdit->append(QString::fromStdString(str.c_str()));}if (fileformat.getDataset()->findAndGetOFString(DCM_PatientName, str).good())ui->textEdit->append(QString::fromUtf8(toUTF8(charset,str).c_str()));if (fileformat.getDataset()->findAndGetOFString(DCM_PatientID, str).good())ui->textEdit->append(QString::fromUtf8(toUTF8(charset,str).c_str()));if (fileformat.getDataset()->findAndGetOFString(DCM_BodyPartExamined, str).good())ui->textEdit->append(QString::fromUtf8(toUTF8(charset,str).c_str()));if (fileformat.getDataset()->findAndGetOFString(DCM_PatientPosition, str).good())ui->textEdit->append(QString::fromUtf8(toUTF8(charset,str).c_str()));}elseui->textEdit->append("Bad file!");
}

执行效果如图:

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 怎么把网站设置成HTTPS访问?
  • Android 应用使用theme处理全局焦点框
  • Java Web实战:利用三层架构与Servlet构建登录注册模块
  • 【Echarts】使用多横坐标轴展示近十五天天气预报
  • 连年(年份)
  • 在国内版Office 365中通过PowerShell命令查询指定主题的邮件详解
  • 轻量级模型解读——基于神经网络架构搜索(NAS)系列
  • 开放式耳机有哪些值得推荐?十大口碑最好开放式蓝牙耳机!
  • 科技与艺术完美融合的LED异形创意圆形(饼/盘)显示屏横空出世
  • 开放式蓝牙耳机推荐?五款高评分爆款机型汇总!
  • 设计模式---中介者模式
  • C++标准的一些特性记录:C++11的constexpr
  • 4G工业路由器:SR700的智能连接解决方案
  • EasyExcel拿表头(二级表头)爬坑,invokeHeadMap方法
  • 音视频入门基础:AAC专题(2)——使用FFmpeg命令生成AAC裸流文件
  • 4个实用的微服务测试策略
  • Debian下无root权限使用Python访问Oracle
  • django开发-定时任务的使用
  • PHP面试之三:MySQL数据库
  • python3 使用 asyncio 代替线程
  • Python进阶细节
  • react 代码优化(一) ——事件处理
  • SQLServer之索引简介
  • Webpack 4 学习01(基础配置)
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 面试遇到的一些题
  • 入门级的git使用指北
  • 算法系列——算法入门之递归分而治之思想的实现
  • 学习JavaScript数据结构与算法 — 树
  • AI算硅基生命吗,为什么?
  • C# - 为值类型重定义相等性
  • ​RecSys 2022 | 面向人岗匹配的双向选择偏好建模
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • $.ajax()参数及用法
  • $L^p$ 调和函数恒为零
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (AngularJS)Angular 控制器之间通信初探
  • (Java)【深基9.例1】选举学生会
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (转载)PyTorch代码规范最佳实践和样式指南
  • (自用)gtest单元测试
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .mysql secret在哪_MySQL如何使用索引
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET Reactor简单使用教程
  • .NET文档生成工具ADB使用图文教程
  • .net中生成excel后调整宽度
  • .vimrc 配置项
  • /etc/shadow字段详解
  • @Mapper作用
  • @PostConstruct 注解的方法用于资源的初始化
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku