使用DCMTK库实现BMP转DCM的互相转换以及JPEG转DCM。使用DCMTK库其中在编译的时候错了好几次,在这有编译好的库给大家分享在此附上连接只需要1积分(DCMTK编译好的库-C/C++其他资源-CSDN下载)。直接使用DCMTK库实现的功能,期间本人也下载了好多但是大部分都没用复制粘贴出来的水贴有点多。其中借鉴了zssure大神的两篇文章(JPEGDICOM医学图像处理:DICOM存储操作之 “多幅JPG图像数据存入DCM文件”_zssure的博客-CSDN博客)(BMPDICOM医学图像处理:DICOM存储操作之“多幅BMP图像数据存入DCM文件”_zssure的博客-CSDN博客_dicom存储)zussre大神在贴中介绍了包括BMP、JPG结构和需要引入的一些文件,我在这再给大家介绍一些Dcm常用的Tag属性值(dicom文件详细解析_峥嵘life的博客-CSDN博客_dicom解析)很感谢峥嵘life大佬,这里再给大家附上一个全的dcm的Tag(DICOM Tags)属于DICOM官方给出的标签很实用虽然没有详解。

使用VC++,MFC实现了Bmp和JPG的相互转换,JPEG转DCM图。包括dcm图Tag值的讲解以及实现。

本文作者原创,转载请附上文章出处与本文链接。

代码实例:

DCMTK库的使用(使用VS大部分版本属性设置都是一样的)

VS2017项目->属性->

VC++目录->

包含目录填DCMTK库的include目录(X:\dcmtk库\include\)

库目录填DCMTK库的LIB目录(X:\dcmtk库\lib\)

C++常规->附加包含目录(X:\dcmtk库\include\)

预处理器添加(_CRT_SECURE_NO_WARNINGS)

链接器->输入->附加依赖项->

WS2_32.lib;NetAPI32.lib;WSock32.lib;charls.lib;dcmdata.lib;dcmdsig.lib;dcmimage.lib;dcmimgle.lib;dcmjpeg.lib;dcmjpls.lib;dcmnet.lib;dcmpstat.lib;dcmqrdb.lib;dcmsr.lib;dcmtls.lib;dcmwlm.lib;i2d.lib;ijg8.lib;ijg12.lib;ijg16.lib;oflog.lib;ofstd.lib;

引入头文件

#include "stdafx.h"
#include <stdio.h>
#include "afxdialogex.h"
#include "dcmtk/dcmimgle/dcmimage.h"
#include "dcmtk/dcmdata/dcistrmf.h"
#include "dcmtk/dcmdata/dctk.h"
#include "dcmtk/config/osconfig.h"
#include "dcmtk/dcmdata/libi2d/i2dbmps.h"#include "dcmtk/dcmdata/dcpixel.h"
#include "dcmtk/dcmdata/dcpixseq.h"
#include "dcmtk/dcmdata/dcpxitem.h"#include <direct.h>
/*----BMP图像解析----*/
#include "dcmtk/dcmdata/libi2d/i2dbmps.h"
/*----JPEG图像解析----*/
#include "dcmtk/dcmdata/libi2d/i2djpgs.h"
#include "dcmtk/dcmdata/libi2d/i2doutpl.h"
#include "dcmtk/dcmdata/dcerror.h"

BMP转DCM:

//CString BatchConversionFile bmp图片路径
OFCondition status;DcmFileFormat fileformat;DcmDataset* mydatasete = fileformat.getDataset();AddDicomElements((DcmDataset*&)mydatasete);Uint16 rows, cols, samplePerPixel, bitsAlloc, bitsStored, highBit, pixelRpr, planConf, pixAspectH, pixAspectV;OFString photoMetrInt;Uint32 length;E_TransferSyntax ts;//10char* mydata = new char[1024 * 1024 * 110];memset(mydata, 0, sizeof(char) * 1024 * 1024 * 110);char* tmpData = mydata;char curDir[100];getcwd(curDir, 100);//循环添加4张图片for (int i = 0; i < 1; ++i){OFString num;char numtmp[100];memset(numtmp, 0, sizeof(char) * 100);sprintf(numtmp, "1.bmp", curDir, i + 1);OFString filename = OFString(numtmp);I2DBmpSource* bmpSource = new I2DBmpSource();bmpSource->setImageFile(filename);char* pixData = NULL;bmpSource->readPixelData(rows, cols, samplePerPixel, photoMetrInt, bitsAlloc, bitsStored, highBit, pixelRpr, planConf, pixAspectH, pixAspectV, pixData, length, ts);memcpy(tmpData, pixData, length);tmpData += length;delete bmpSource;};mydatasete->putAndInsertUint16(DCM_SamplesPerPixel, samplePerPixel);mydatasete->putAndInsertString(DCM_NumberOfFrames, "1");mydatasete->putAndInsertUint16(DCM_Rows, rows);mydatasete->putAndInsertUint16(DCM_Columns, cols);mydatasete->putAndInsertUint16(DCM_BitsAllocated, bitsAlloc);mydatasete->putAndInsertUint16(DCM_BitsStored, bitsStored);mydatasete->putAndInsertUint16(DCM_HighBit, highBit);mydatasete->putAndInsertUint8Array(DCM_PixelData, (Uint8*)mydata, 1 * length);mydatasete->putAndInsertOFStringArray(DCM_PhotometricInterpretation, photoMetrInt);status = fileformat.saveFile("Multibmp2dcmtest.dcm", ts);if (status.bad()){AfxMessageBox("BMP TO DCM Conversion Error");}return ;

Dcm转Bmp

//CString DcmFileTo图片的路径
// CString TheFileName输出的文件名
if (DcmFileTo.IsEmpty()){AfxMessageBox("DcmConversion_File NULL");return;}if (TheFileName.IsEmpty()){AfxMessageBox("DcmConversion_Place NULL");return;}DcmFileFormat *pDcmFile = new DcmFileFormat();OFFilename filePath = DcmFileTo;OFCondition pCondition = pDcmFile->loadFile(filePath);//filePath为DCM文件路径if (pCondition.good()){E_TransferSyntax xfer = pDcmFile->getDataset()->getOriginalXfer();DicomImage *pDicomImage = new DicomImage(pDcmFile, xfer);pDicomImage->setWindow(100, 400);//调窗这里值设置不同出来的效果就会大不相同char bmpto_file[100];strncpy(bmpto_file, (LPCTSTR)TheFileName, sizeof(bmpto_file));if (pDicomImage->writeBMP(bmpto_file)) {}else {AfxMessageBox("非标准Dcm格式文件转换失败");return;}}

JPEG转DCM:

/*CString TheJPGFile图片路径
*/
if (TheJPGFile.IsEmpty()){AfxMessageBox(" JPG File Error");return;}//TheName 输出的后缀   TheFile 获取到的第一张BMP图的文件名  TheFileName 输出的文件名CString TheName = ".dcm", TheFileName, The_Name = "_T.dcm", The_FileName;//删除路径多余符号int nPos = TheJPGFile.Find('\\');CString sSubStr = TheJPGFile;while (nPos){sSubStr = sSubStr.Mid(nPos + 1, sSubStr.GetLength() - nPos);  //取'\'右边字符串nPos = sSubStr.Find('\\');   //不包含'\',函数值返回-1 if (nPos == -1){nPos = 0;}}//删除后缀int pos = sSubStr.ReverseFind('.');if (pos > 0) {}CString strRet = sSubStr.Left(pos);//输出的文件名TheFileName = strRet + TheName;The_FileName = strRet + The_Name;OFCondition status;DcmPixelSequence *seq = new DcmPixelSequence(DcmTag(DCM_PixelData, EVR_OB));DcmFileFormat fileformat;DcmDataset* mydatasete = fileformat.getDataset();AddDicomElements((DcmDataset*&)mydatasete);Uint16 rows, cols, samplePerPixel, bitsAlloc, bitsStored, highBit, pixelRpr, planConf, pixAspectH, pixAspectV;OFString photoMetrInt;Uint32 length;E_TransferSyntax ts;char curDir[255];getcwd(curDir, 255);seq->insert(new DcmPixelItem(DcmTag(DCM_Item, EVR_OB)));for (int i = 0; i < 1; ++i){OFString num;char numtmp[255];memset(numtmp, 0, sizeof(char) * 255);sprintf(numtmp, TheJPGFile, curDir, i + 1);OFString filename = OFString(numtmp);I2DJpegSource* bmpSource = new I2DJpegSource();bmpSource->setImageFile(filename);char* pixData = NULL;                            //photoMetrIntbmpSource->readPixelData(rows, cols, samplePerPixel, photoMetrInt, bitsAlloc, bitsStored, highBit, pixelRpr, planConf, pixAspectH, pixAspectV, pixData, length, ts);DicomImage *pDicomImage = new DicomImage(TheJPGFile);pDicomImage->setWindow(3570, 5020);//调窗这里值设置不同出来的效果就会大不相同DcmPixelItem *newItem = new DcmPixelItem(DcmTag(DCM_Item, EVR_OB));if (newItem != NULL){seq->insert(newItem);OFCondition result = newItem->putUint8Array((Uint8*)pixData, length);//OFCondition result = newItem->putUint16Array((Uint16*)pixData, length);}delete bmpSource;};OFFilename str_FileName = TheFileName;//pDicomImage->setWindow(100, 400);mydatasete->putAndInsertUint16(DCM_SamplesPerPixel, samplePerPixel);mydatasete->putAndInsertString(DCM_NumberOfFrames, "1");mydatasete->putAndInsertUint16(DCM_Rows, rows);mydatasete->putAndInsertUint16(DCM_Columns, cols);mydatasete->putAndInsertUint16(DCM_BitsAllocated, bitsAlloc);mydatasete->putAndInsertUint16(DCM_BitsStored, bitsStored);mydatasete->putAndInsertUint16(DCM_HighBit, highBit);mydatasete->putAndInsertOFStringArray(DCM_PhotometricInterpretation, photoMetrInt);//"MONOCHROME2"mydatasete->putAndInsertString(DCM_UltrasoundColorDataPresent, "0");mydatasete->putAndInsertUint16(DCM_SamplesPerPixel, 1);mydatasete->insert(seq, OFFalse, OFFalse);//????mydatasete->putAndInsertString(DCM_SourceApplicationEntityTitle, "Holter");mydatasete->putAndInsertString(DCM_SOPClassUID, "1.2.840.10008.5.1.4.1.17");mydatasete->putAndInsertString(DCM_SOPInstanceUID, "1.2.7.3.8.2019.02.08.00.16.28.1.1");status = fileformat.saveFile(str_FileName, ts);if (status.bad()){AfxMessageBox("Error");}return;

PS:以上是三种转换方式楼主亲测,虽然补了很多漏洞,毕竟努力了好久了完整版的就不发出来了,把大概的实现发出来了。AddDicomElements((DcmDataset*&)mydatasete);这个删掉就好缺什么字段在后面使用mydatasete->这个添加就好,有三四处内存泄漏需要各位小伙伴自己找一下,dcmtk的标准还有一些字段的意思还得大家自己去研究,按照这个改一改完整版的完全可以做出来,有什么问题可以留言,看到会及时回复的。(如果对你有帮助记得点赞关注在走哦)

附加的完整Lib包下载链接(dcmtk图片转换附加库-C++其他资源-CSDN下载);

DICOM医学图像处理:BMP转DCM、DCM转BMP、多张BMP转DCM、JPG转DCM,,多张JPG转DCM。相关推荐

  1. DICOM医学图像处理:DICOM存储操作之“多幅BMP图像数据存入DCM文件”

    背景: 本专栏"DICOM医学图像处理"受众较窄,起初只想作为自己学习积累和工作经验的简单整理.前几天无聊浏览了一下,发现阅读量两极化严重,主要集中在"关于BMP(JPG ...

  2. DICOM医学图像处理:DICOM存储操作之 “多幅JPG图像数据存入DCM文件”

    背景: 续上篇,继续介绍如何将多幅JPG图像数据存入DCM文件.即将有损压缩数据直接写入DCM文件,存储为Multi-frame形式. 多幅JPG图像数据存入DCM文件: 为了避免引起歧义,这里着重说 ...

  3. DICOM医学图像处理:二零一四▪DICOM专栏一览

    题记 二零一四刚过,新年伊始就发生了"外滩踩踏"恶性事件,告诫我们要珍爱生命,为自己更为家人-- 回顾去年,有些许收获.有些许感慨-- 曾经听过一个段子说两个在公司工作多年的老员工 ...

  4. DICOM医学图像处理:Dcmtk与fo-dicom保存文件的不同设计模式之“同步VS异步”+“单线程VS多线程”...

    2019独角兽企业重金招聘Python工程师标准>>> 一.背景: 最近一直在做DCM相关的编程工作,以前项目使用C++居多,所以使用DCMTK开源库,而目前团队使用C#居多,所以需 ...

  5. 【转】DICOM医学图像处理:DICOM网络传输

    背景: 专栏取名为DICOM医学图像处理原因是:博主是从医学图像处理算法研究时开始接触DICOM协议的.当初认识有局限性,认为DICOM只是一个简单的文件格式约定,简而言之,我当时认为DICOM协议就 ...

  6. 【转】DICOM医学图像处理:开源库mDCM与DCMTK的比較分析(一),JPEG无损压缩DCM图像

    转自:https://www.cnblogs.com/mfrbuaa/p/4004114.html 有修订 背景介绍: 近期项目需求,需要使用C#进行最新的UI和相关DICOM3.0医学图像模块的开发 ...

  7. DICOM医学图像处理:开源库mDCM与DCMTK的比较分析(一),JPEG无损压缩DCM图像(续)...

    2019独角兽企业重金招聘Python工程师标准>>> 背景: 上周通过单步调试,找出了开源库mDCM与DCMTK在对DICOM图像进行JPEG无损压缩时的细小区别,并顺利实现了在C ...

  8. [转]DICOM医学图像处理:Deconstructed PACS之Orthanc

    转载:http://blog.csdn.net/zssureqh/article/details/41424027 背景: 此篇博文介绍一个开源的.基于WEB的DICOM Server软件.该开源软件 ...

  9. php pacs,DICOM医学图像处理:WEB PACS初谈四,PHP DICOM Class – 只要踏出一步,路就在前方——zssure – CSDN博客...

    背景: 预告了好久的几篇专栏博文一直没有整理好,主要原因是早前希望搭建的WML服务器计划遇到了问题.起初以为参照DCMTK的官方文档wwwapp.txt结合前两天搭建的WAMP服务器可以顺利的实现WM ...

最新文章

  1. hdu3074 线段树求区间乘积(单点更新)
  2. Akamai Martin Horčička:最新网络优化技术及编程语言分析
  3. 腾讯无边界网络 致胜企业安全新战场
  4. python time模块计算时长_python time模块详解
  5. 网站中公用头部与尾部
  6. 怎样搭建轻量级架构-代码组织篇
  7. 自检代码中trustmanager漏洞_Windows内核漏洞利用教程
  8. 动态参数 maven_Spring Security 动态url权限控制(三)
  9. win10X64 + vs2015通过Cmake编译Opencv(一)
  10. php如何自动阅卷,智能评卷系统 自动阅卷软件
  11. IDEA集成SVN插件及SVN使用 - 超详细
  12. 10 个win10上记事本的替代品
  13. 微信小程序云端图片上传,存储,获取,显示
  14. TikZ绘图示例——尺规作图:过直线外一点作给定直线的平行线
  15. Ubuntu下启动图形界面startx报错connection to X server lost
  16. 一种基于XGBOOST的企业员工稳定性(员工离职)预测方法
  17. 体会现实生活的两个月(上)
  18. Attentional Factorization Machine(AFM)复现笔记
  19. 郑和下西洋有两个主要目的:
  20. c语言二级指针的作用,为什么要使用二级指针?

热门文章

  1. udec采场开挖教程_UDEC_数值模拟(入门学习)
  2. C语言基础-数组逆序输出
  3. EC11旋转编码器电路和程序
  4. Pycurl的简单使用与对比 - 一只橘子的异想世界
  5. IDEA报错:Plugin ‘org.springframework.boot:spring-boot-maven-plugin:‘ not found
  6. 各行业分析研究报告 入口汇总
  7. java的nullpoint_java.lang.NullPointerException
  8. anacoda里面安装包显示失败_Premiere2020安装包下载及安装教程(附pr2020配置要求)...
  9. python计算ks值 代码_python画KS图,求KS值
  10. 【解决】联想拯救者vmware启动虚拟机蓝屏重启问题