您的位置:首页 > 其它

使用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真的坑好多。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dicom