背景

前段时间博文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位环境的问题。











作者:zssure@163.com

时间:2015/08/02

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

  1. dicom(dcm)文件批量Study Instance UID打包整理工具

    一款可以自动识别原始dicom文件Study Instance UID的工具. 如果你有一堆混乱不堪的dcm文件,这个小工具能帮助你将这些无序的dicom文件按照Study Instance UID压 ...

  2. python .dcm文件读取,并转化为.jpg格式

    .dcm文件是DICOM(Digital Imaging and Communications in Medicine)即医学数字成像和通信中记录医学图像和相关信息的文件,在用于医学图像处理的时候我们 ...

  3. 使用dcmtk库读取.dcm文件并获取信息+使用OpenCV显示图像

    借助VS2013和OpenCV的绘图功能,在工程DICOMReader.sln中实现了对单张.dcm图像的读取与显示,以下是详细步骤. 前期准备工作 编译器:VS2013 库:dcmtk-3.6.0( ...

  4. gulp压缩css文件跟js文件

    越到最后啊 就越发现,真的很理解那句话 就是自己多学一点一点知识,就少一句问别人的东西 这是多么痛苦的领悟 今天需要压缩css跟js文件 然后不懂啊 就问别人啊 就问啊问啊 然后再上网了解啊了解啊 用 ...

  5. 如何使用grunt压缩js文件

    jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发人员,如果你现在还不知道grunt或者听说过 ...

  6. zlib压缩一个文件为gzip格式

    网上有很多针对zlib的总结,但是很零散,自己经过总结,实现了用zlib压缩一个文件为gzip格式,似的可以直接使用winr工具解压. 具体方法是使用zlib的deflate系列函数,将buffer压 ...

  7. iis7 压缩js文件和启用gzip压缩

    压缩js文件 打开IIS 7的配置文件:c:\windows\system32\inetsrv\config\applicationhost.config 在<staticContent loc ...

  8. [转]C#压缩打包文件

    /// <summary> /// 压缩和解压文件 /// </summary> public class ZipClass { /// <summary> /// ...

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

    albert1017 Linux下压缩某个文件夹(文件夹打包) tar -zcvf /home/xahot.tar.gz /xahottar -zcvf 打包后生成的文件名全路径 要打包的目录例子:把 ...

随机推荐

  1. Win7上安装Oracle数据库

    由于ORACLE并没有FOR WIN7的版本,必须下载for vista_w2k8这个版本,将oralce 10G的安装镜像解压到硬盘,然后修改安装目录下的rehost.xml和oraparam.in ...

  2. Jenkins+ant+jmeter接口自动化

    1.Jenkins新建slave节点 2.Jenkins新建job,配置job,关联到slave, 3.执行构建 build文件如下 <?xml version="1.0" ...

  3. java 分解整数 【个 十 百】(数组案例)

    求一个数两位数的个位数,十位数,百位数及千位: int num = 53; int g = (num / 1) % 10;  //个位 int s = (num / 10) % 10; //十位 in ...

  4. log4j建立propertie后要建立log4j2.xml

    log4j.properties ### \u8BBE\u7F6E### log4j.rootLogger = debug,stdout,D,E ### \u8F93\u51FA\u4FE1\u606 ...

  5. linux centos7 安装nginx并启动

    Linux下安装Nginx完整教程及常见错误解决方案:https://blog.csdn.net/chenxiaochan/article/details/63688346 CentOS 7 安装Ng ...

  6. Python :用两个栈实现队列

    转自:http://blog.csdn.net/Lynette_bb/article/details/75092745 牛客网上的剑指 offer的在线编程: 题目描述 用两个栈来实现一个队列,完成队 ...

  7. sql server用SQL语句查看字段说明

    SELECT t.[name] AS 表名,c.[name] AS 字段名,cast(ep.[value] )) AS [字段说明] FROM sys.tables AS t INNER JOIN s ...

  8. Jsp页面,结果集分页和sql(top)分页的性能对比

    jsp页面两种分页模式: 第一种: 结果集分页,主要代码见下面: ResultSet rs=stmt.executeQuery(sql); ResultSetMetaData md=rs.getMet ...

  9. 【译】x86程序员手册28-7.7任务地址空间

    7.7 Task Address Space 任务地址空间 The LDT selector and PDBR fields of the TSS give software systems desi ...

  10. JS实现LOGO像雪花一样落下特效

    <HTML><HEAD><TITLE>LOGO从上落下</TITLE> <SCRIPT language=JavaScript> //窗口改 ...