使用dcm4che3对jpeg压缩的dcm文件进行解压
2017-03-15 09:42
579 查看
前段时间项目比较忙,最近稍微得些空闲时间将dcm4che3的一些学习笔记整理一下
今天总结一下使用dcm4che3对一些压缩过的dcm文件进行解压。在一些情况下,为了减小dcm文件网络传输的大小,需要对dcm文件中的PixelData数据进行JPEG压缩。JPEG压缩分为有损压缩和无损压缩。因为是医学的影像所以一般厂商都是采用无损压缩。压缩率可以达到60%左右,效果还不错。
dcm4che3也支持对dmc文件的JPEG压缩和解压。
解压使用的包是dcm4che-imageio.解压用的类是StreamDecompressor.解压过程分两步,首先修改TransferSyntaxUID的值。TransferSyntaxUID代表了dicom的传输语法。以下是值的表示含义:
未压缩: Implicit VR Little Endian: Default Transfer Syntax for DICOM 1.2.840.10008.1.2 Explicit VR Little Endian 1.2.840.10008.1.2.1 Explicit VR Big Endian 1.2.840.10008.1.2.2 无损压缩: JPEG Lossless : Default Transfer Syntax for Lossless JPEG ImageCompression 1.2.840.10008.1.2.4.70 JPEG 2000 Image Compression (Lossless Only) 1.2.840.10008.1.2.4.90 RLE Lossless 1.2.840.10008.1.2.5 有损压缩: Default Transfer Syntax for Lossy JPEG 12 Bit Image Compression 1.2.840.10008.1.2.4.51 LOSSY(8 bit) 1.2.840.10008.1.2.4.50 动态: MPEG2 image Compression 1.2.840.10008.1.2.4.100
下来开始正式解压:第一步读取文件头信息,并将TransferSyntaxUID修改为1.2.840.10008.1.2.1
表示未压缩小端存储,一般情况下未压缩的dcm文件都是使用这种TransferSyntaxUID。将修改后的头信息写入DicomOutputStream。
第二步new StreamDecompressor(dis, tsuid, dos);参数是:(压缩的dcm文件的 DicomInputStream,压缩的dcm文件的TransferSyntaxUID,解压的dcm文件DicomOutputStream)
然后调用decompress方法进行解压。
一下是一些代码
public static boolean uncompress(String url) throws IOException { boolean isUncompress = false; File srcFile = new File(url); File outFile = new File("G:/DicomImage/mini/L_" + srcFile.getName()); DicomInputStream dis = null; DicomOutputStream dos = null; StreamDecompressor decompressor = null; StreamCompressor compressor = null; try { dis = new DicomInputStream(srcFile); dos = new DicomOutputStream(outFile); Attributes fmi = dis.readFileMetaInformation(); String tsuid = fmi.getString(Tag.TransferSyntaxUID); fmi.setString(Tag.TransferSyntaxUID, VR.UI, "1.2.840.10008.1.2.1"); dos.writeFileMetaInformation(fmi); decompressor = new StreamDecompressor(dis, tsuid, dos); decompressor.decompress(); } catch (Exception e) { System.out.println(e); } finally { SafeClose.close(dis); SafeClose.close(dos); isUncompress = true; if (decompressor != null) decompressor.dispose(); } return isUncompress; }
记录一下遇到的小坑:dcm4che3的解压内部采用的是 java 的 图片编码和解码器。也就是上个博文所提到的java包(jai_imageio_for_win32)。这个java包,SUN公司只出了32位版本的,所以说dcm4che3的解压缩压缩功能只支持32位的JDK. 好在WIN64位系统上装32位JDK也能跑。
还有一个小小坑,当时项目在eclipse上配置的java环境是jre。运行其他程序都是OK的。但遇到解压dicom就会报 JVM错误。找了好久的原因,最后把java环境换成jdk就OK 了。原因是:安装jai_imageio_for_win32的时候目标指向是JDK所以必须指向JDK。
感慨:dcm4che3真的坑好多。
相关文章推荐
- 使用C#2.0进行文件压缩和解压
- 使用Zlib库进行文件的压缩和解压
- Qt使用QuaZip对文件进行压缩解压操作
- 使用apache的工具类进行zip(rar等压缩文件)的解压
- 使用QuaZip对文件进行压缩解压操作
- 使用C#2.0进行文件压缩和解压
- 使用C#2.0进行文件压缩和解压
- 使用 C# 对文件进行压缩和解压
- Java使用apache ant包进行文件压缩、解压
- 使用Zlib库进行文件的压缩和解压
- 使用GZIPOutputStream和GZIPInputStream进行压缩解压文件
- 使用C#2.0进行文件压缩和解压(转)
- 使用Zlib库进行文件的压缩和解压
- 使用C#进行文件压缩和解压
- 使用C#2.0进行文件压缩和解压
- Qt使用QuaZip对文件进行压缩解压操作
- 【转载】使用C#2.0进行文件压缩和解压
- C#使用ICSharpCode.SharpZipLib.dll进行文件的压缩与解压功能
- 使用PHP对文件进行压缩解压(zip)
- 使用C#2.0进行文件压缩和解压