DICOM:dcm4che工具包怎样压缩dcm文件探讨(续篇)

背景

前段时间博文DICOM:dcm4che工具包怎样压缩dcm文件探讨(前篇)提到了一个问题:“利用dcm4che工具包中的dcm2dcm来进行dcm文件的压缩和加压缩即改变dcm文件里的Transfer Syntax,比如由1.2.840.10008.1.2(Implicit VR Little Endian)变成1.2.840.10008.1.2.4.70(JPEG LossLess,Non-Hierarchical,First_order Prediction Process 14)

可是因为之前对Java中相关Image IO类不了解,因此并未找到问题的解决方式。

值得高兴的是,在发文后不久就收到了热心博友的邮件,并在附件中给出了解决方式须要的安装包。

依照邮件的提示,经过在本地Eclipse调试,已验证能够顺利攻克了该问题,特再发一文说明,并再次感谢博友nanarongrong无私相助。

博友解决方式:

本地环境已经依照博文前篇DICOM:dcm4che工具包怎样压缩dcm文件探讨(前篇)更换为32位环境。在此如博友nanrongrong在邮件中的说明所看到的。问题的解决办法是本地32位JRE执行环境缺少clib_jiio.dll导致的,双击安装邮件中的附件。

安装完毕后能够看到在在JRE的bin文件夹下多出了clib_jiio.dll文件。lib/ext文件夹下多出了jai_imageio.jar文件。

又一次在本地进行測试。输入dcm2dcm -t 1.2.840.10008.1.2.4.70 c:\test.dcm c:\testjpeg.dcm

例如以下图所看到的,命令行提示已经顺利转换成功。可是不要高兴的太早,用DICOM阅读器打开发现居然无法顺利导入。

使用dcmtk提供的dcmdump工具。得到例如以下输出结果:

如上图所看到的。看过我专栏的博友应该立马能够反应出问题出错的地方。DICOM中在压缩和解压缩问题中最常见的错误就是无法顺利定位PixelData或是PixelData数据写入不完整(如博文DICOM医学图像处理:DICOM存储操作之 “多幅JPG图像数据存入DCM文件”中的实例)或是PixelData数据长度写入错误导致解析失败(如本博文、博文DICOM医学图像处理:fo-dicom网络传输之 C-Echo and C-Store等等)。用UltraEdit以二进制方式打开test-jpeg.dcm文件。定位到PixelData(0x7fe0 0010),例如以下图所看到的:

依照DICOM3.0标准对压缩PixelData的描写叙述(为了方便描写叙述。再次将博文中的截图贴出来),每个压缩片段Fragment(即标签0xfffe e000)后须要明白指出兴许片段的长度。而刚才得到的test-jpeg.dcm文件的第二个Fragment中的Value Length居然是00 00 00 00。

为了验证我们的想法,在UltraEdit中手动写入Fragment的长度。首先在UE中拖动到test-jpeg.dcm文件末尾,定位到0xfffe e0dd(即SequenceItem结束符)。位置为0x3A23D。起始位置为0x87C,由此得出长度为0x3A23D-0x87C+0x1=0x39A72,依照小段须排列为 72 9A 03 00。例如以下图改动后能够顺利打开图像

至此能够顺利的利用dcm2dcm工具完毕dcm文件的JPEG无损 压缩,只是另一点点小问题。

继续往下看。

dcm2dcm源代码剖析:

官网下载dcm4che2的源代码。在Eclipse中导入后。启动dcm4che-tool-dcm2dcmproject。调试參数配置例如以下:

注:jre调试环境应该指定为我们安装jai_imageio-1_0_01-lib-windows-i586-jdk库后的32位执行环境。

单步调试到DicomImageWriter.java中的writeBytesToSequence函数能够看到顺利写入了PixelData的长度236146。即十六进制的0x39A72。因此能够证明dcm2dcmproject源代码没有问题,可能是本地cmd环境下配置的dcm4che2-bin包比較旧导致出现的问题,又一次生成dcm4che2-tool-dcm2dcm.jar包。又一次再本地測试。能够顺利得到正确的图像。

至此该问题顺利解决!

jai_imageio库:

感谢博友nanarongrong的热心帮助,jai_imageio的Windows32位环境库已顺利上传到CSDN,下载链接为:jai_imageio_for_win32

备注:依照dcm4chee官方安装说明文档。dcm4chee以及dcm4che2-tools在Linux32bits以及Linux64bits。以及Windows32bits能够顺利完毕dcm压缩和解压缩,只有Windows64bits环境不可,这也就是我们上文遇到的问题为什么将JRE切换到32位环境的问题。

作者:[email protected]

时间:2015/08/02

时间: 2024-10-05 05:08:30

DICOM:dcm4che工具包怎样压缩dcm文件探讨(续篇)的相关文章

DICOM:dcm4che工具包如何压缩dcm文件探讨(续篇)

背景 前段时间博文DICOM:dcm4che工具包如何压缩dcm文件探讨(前篇)提到了一个问题:"利用dcm4che工具包中的dcm2dcm来进行dcm文件的压缩和加压缩,即改变dcm文件中的Transfer Syntax,例如由1.2.840.10008.1.2(Implicit VR Little Endian)变成1.2.840.10008.1.2.4.70(JPEG LossLess,Non-Hierarchical,First_order Prediction Process 14).

DICOM:dcm4che工具包如何压缩dcm文件探讨(前篇)

背景: DICOM专栏系列中曾介绍过大多数的DICOM标准开源实现库,例如dcmtk.fo-dicom.mDCM,以及dcm4che.之前的介绍大都局限在表层,并未深入对比分析彼此的不同,因此在具体使用过程中很容易踩坑--例如此次对于dcm文件的压缩. 近期由于项目需要,外出给客户部署云平台,鉴于当地网络环境以及数据量的问题,急需对数据进行压缩处理,由于医学数据主要用于临床辅助诊断,因此不能采用有损压缩,原本使用dcmtk对dcm进行无损和有损压缩都很方便(详情请检索之前的专栏博文),怎奈使用d

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

背景: 续上篇,继续介绍如何将多幅JPG图像数据存入DCM文件.即将有损压缩数据直接写入DCM文件,存储为Multi-frame形式. 多幅JPG图像数据存入DCM文件: 为了避免引起歧义,这里着重说明一下.本博文的描述的场景是:假设我们手中有多张JPG文件,想把JPG文件写入DCM文件,即单个DCM文件包含多幅图像信息的Multi-Frame形式.该问题之前与CSDN博友y317215133y也讨论过,当时我在OFFIS论坛中找到了一个帖子直接给了y317215133y答复.今天重新梳理了一下

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

背景: 本专栏"DICOM医学图像处理"受众较窄,起初只想作为自己学习积累和工作经验的简单整理.前几天无聊浏览了一下,发现阅读量两极化严重,主要集中在"关于BMP(JPG)与DCM格式转换"和"DICOM 通讯协议",尤其是许久前的第一篇博文DCMTK开源库的学习笔记1:将DCM文件保存成BMP文件或数据流(即数组).因此在2014年底前打算写几篇关于DCM格式转换的文章,此次主要聚焦"如何将BMP.JPG等常规图像保存成DCM文件&q

前端开发环境之GRUNT自动WATCH压缩JS文件与编译SASS文件

前端开发环境之GRUNT-JAVASCRIPT任务运行器 前言: 1.sass编译为css文件,早先时刻写css,后来看了sass挺不错的,于是在新的项目中开始使用上了sass. 原方法: ①安装ruby ②编译sass文件(eg:style) sass style.scss style.css ③监控文件/文件夹的变化来自动编译sass文件 sass --watch style.scss:style.css #file sass --watch cssFilePath            

利用Node 搭配uglify-js压缩js文件,批量下载图片到本地

Node的便民技巧-- 压缩代码 下载图片 压缩代码 相信很多前端的同学都会在上线前压缩JS代码,现在的Gulp Webpack Grunt......都能轻松实现.但问题来了,这些都不会,难道就要面对几十个JS文件一遍遍来回“复制-压缩-创建-粘贴”,这样太不人性化了. 于是可以借助Node + uglify-js 轻松实现.(前提你会点node操作) 1.首先看一下目录: |--uglifyJS |--js |--test1.js |--test2.js |--uglify.js   //这

Linux下压缩某个文件夹(文件夹打包)

tar -zcvf /home/xahot.tar.gz /xahottar -zcvf 打包后生成的文件名全路径 要打包的目录 例子:把/xahot文件夹打包后生成一个/home/xahot.tar.gz的文件.zip 压缩方法:压缩当前的文件夹 zip -r ./xahot.zip ./* -r表示递归zip [参数] [打包后的文件名] [打包的目录路径]解压 unzip xahot.zip 不解释linux zip命令的基本用法是:linux zip命令参数列表:-a 将文件转成ASCI

C# .NET 使用第三方类库DotNetZip解压/压缩Zip文件 (ZT)

DotNetZip on CodePlex: http://dotnetzip.codeplex.com/ 详细的可以看源代码--总之感觉比SharpZipLib好用.而且DotNetZip支持VB,C#以及任何.NET语言. 加压:(从CodePlex上偷过来的) using (ZipFile zip = new ZipFile()) { // add this map file into the "images" directory in the zip archive 把这个PN

[转]C#压缩打包文件

/// <summary> /// 压缩和解压文件 /// </summary> public class ZipClass { /// <summary> /// 所有文件缓存 /// </summary> List<string> files = new List<string>(); /// <summary> /// 所有空目录缓存 /// </summary> List<string> p