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阅读器打开发现竟然无法顺利导入。
DICOM:dcm4che工具包如何压缩dcm文件探讨(续篇)_第1张图片
使用dcmtk提供的dcmdump工具,得到如下输出结果:
DICOM:dcm4che工具包如何压缩dcm文件探讨(续篇)_第2张图片
如上图所示,看过我专栏的博友应该立刻能够反应出问题出错的地方,DICOM中在压缩和解压缩问题中最常见的错误就是无法顺利定位PixelData或是PixelData数据写入不完整(如博文DICOM医学图像处理:DICOM存储操作之 “多幅JPG图像数据存入DCM文件”中的实例)或是PixelData数据长度写入错误导致解析失败(如本博文、博文DICOM医学图像处理:fo-dicom网络传输之 C-Echo and C-Store等等)。用UltraEdit以二进制方式打开test-jpeg.dcm文件,定位到PixelData(0x7fe0 0010),如下图所示:
DICOM:dcm4che工具包如何压缩dcm文件探讨(续篇)_第3张图片
按照DICOM3.0标准对压缩PixelData的描述(为了方便描述,再次将博文中的截图贴出来),每一个压缩片段Fragment(即标签0xfffe e000)后需要明确指出后续片段的长度,而刚才得到的test-jpeg.dcm文件的第二个Fragment中的Value Length竟然是00 00 00 00。
DICOM:dcm4che工具包如何压缩dcm文件探讨(续篇)_第4张图片
为了验证我们的想法,在UltraEdit中手动写入Fragment的长度。首先在UE中拖动到test-jpeg.dcm文件末尾,定位到0xfffe e0dd(即SequenceItem结束符),位置为0x3A23D,起始位置为0x87C,由此得出长度为0x3A23D-0x87C+0x1=0x39A72,按照小段须排列为 72 9A 03 00,如下图修改后可以顺利打开图像
DICOM:dcm4che工具包如何压缩dcm文件探讨(续篇)_第5张图片
DICOM:dcm4che工具包如何压缩dcm文件探讨(续篇)_第6张图片
至此可以顺利的利用dcm2dcm工具完成dcm文件的JPEG无损 压缩,不过还有一点点小问题。继续往下看。

dcm2dcm源码剖析:

从官网下载dcm4che2的源码,在Eclipse中导入后,启动dcm4che-tool-dcm2dcm工程。调试参数配置如下:
DICOM:dcm4che工具包如何压缩dcm文件探讨(续篇)_第7张图片
注:jre调试环境应该指定为我们安装jai_imageio-1_0_01-lib-windows-i586-jdk库后的32位运行环境。
DICOM:dcm4che工具包如何压缩dcm文件探讨(续篇)_第8张图片
DICOM:dcm4che工具包如何压缩dcm文件探讨(续篇)_第9张图片
单步调试到DicomImageWriter.java中的writeBytesToSequence函数可以看到顺利写入了PixelData的长度236146,即十六进制的0x39A72。因此可以证明dcm2dcm工程源码没有问题,可能是本地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位环境的问题。
DICOM:dcm4che工具包如何压缩dcm文件探讨(续篇)_第10张图片




作者:[email protected]
时间:2015/08/02

你可能感兴趣的:(DICOM,dcm4che,jaiimageio,jpeg-ls)