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位环境的问题。
作者:zssure@163.com
时间:2015/08/02
DICOM:dcm4che工具包怎样压缩dcm文件探讨(续篇)的更多相关文章
- dicom(dcm)文件批量Study Instance UID打包整理工具
一款可以自动识别原始dicom文件Study Instance UID的工具. 如果你有一堆混乱不堪的dcm文件,这个小工具能帮助你将这些无序的dicom文件按照Study Instance UID压 ...
- python .dcm文件读取,并转化为.jpg格式
.dcm文件是DICOM(Digital Imaging and Communications in Medicine)即医学数字成像和通信中记录医学图像和相关信息的文件,在用于医学图像处理的时候我们 ...
- 使用dcmtk库读取.dcm文件并获取信息+使用OpenCV显示图像
借助VS2013和OpenCV的绘图功能,在工程DICOMReader.sln中实现了对单张.dcm图像的读取与显示,以下是详细步骤. 前期准备工作 编译器:VS2013 库:dcmtk-3.6.0( ...
- gulp压缩css文件跟js文件
越到最后啊 就越发现,真的很理解那句话 就是自己多学一点一点知识,就少一句问别人的东西 这是多么痛苦的领悟 今天需要压缩css跟js文件 然后不懂啊 就问别人啊 就问啊问啊 然后再上网了解啊了解啊 用 ...
- 如何使用grunt压缩js文件
jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发人员,如果你现在还不知道grunt或者听说过 ...
- zlib压缩一个文件为gzip格式
网上有很多针对zlib的总结,但是很零散,自己经过总结,实现了用zlib压缩一个文件为gzip格式,似的可以直接使用winr工具解压. 具体方法是使用zlib的deflate系列函数,将buffer压 ...
- iis7 压缩js文件和启用gzip压缩
压缩js文件 打开IIS 7的配置文件:c:\windows\system32\inetsrv\config\applicationhost.config 在<staticContent loc ...
- [转]C#压缩打包文件
/// <summary> /// 压缩和解压文件 /// </summary> public class ZipClass { /// <summary> /// ...
- albert1017 Linux下压缩某个文件夹(文件夹打包)
albert1017 Linux下压缩某个文件夹(文件夹打包) tar -zcvf /home/xahot.tar.gz /xahottar -zcvf 打包后生成的文件名全路径 要打包的目录例子:把 ...
随机推荐
- 393 UTF-8 Validation UTF-8 编码验证
详见:https://leetcode.com/problems/utf-8-validation/description/ C++: class Solution { public: bool va ...
- 389 Find the Difference 找不同
给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母.示例:输入:s = "abcd"t = ...
- Entityframework Code First 系列
总篇, 下面会添加每个小篇的链接. 目录如下: 项目搭建 ……
- Android 简单的语音播报
不解释快上车 Main.class package com.example.myapp; import android.app.AlertDialog;import android.os.Bundle ...
- Python 将中文转拼音
文字转拼音 import os.path class PinYin(object): def __init__(self): self.word_dict = {} def load_word(sel ...
- vue具体页面跳转传参方式
1.写数据,可以使用“.”,”[]”,以及setItems(key,value);3种方式. 例如: localStorage.name = proe;//设置name为" proe &qu ...
- vue组件---组件注册
(1)组件名 在注册一个组件的时候,我们始终需要给它一个名字.比如在全局注册的时候我们已经看到了: Vue.component('my-component-name', { /* ... */ }) ...
- pl/sql编程语言
–pl/sql编程语言–pl/sql编程语言是对sql语言的扩展,是的sql语言具有过程化编程的特性–pl/sql编程语言比一般的过程化编程语言,更加灵活高效–pl/sql编程语言主要用来编写存储过程 ...
- JAVA基础——Date和Calendar类
1计算某一月份的最大天数 Calendar time=Calendar.getInstance(); time.clear(); time.set(Calendar.YEAR,year); //yea ...
- JAVA基础——集合类汇总
一.集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...