概要
上一篇博客
DCM4CHE图像显示
是针对未压缩的dicom文件的显示处理,那对于压缩的dicom文件该怎样处理呢?
本文就介绍带压缩协议的dicom文件处理。
一.查看dicom的压缩协议 (也可以通过第三方dicom查看软件查看,tag:0020,0010)
DicomInputStream dis = new DicomInputStream(new File("D:/dicomFile/test/11.dcm"));
System.out.println(dis.getTransferSyntax());
结果:
这里的1.2.840.10008.1.2.4.70(JPEG Lossless),是就是当前dicom的压缩协议,当然这只是其中一种压缩协议,详细压缩协议见DICOM之Transfer Syntax,这里就不再赘述了。
二.解压缩dicom文件
- 添加对应的dcm4che的jar包
在pom.xml里:
<dependency>
<groupId>org.dcm4che</groupId>
<artifactId>dcm4che-imageio</artifactId>
<version>5.21.0</version>
</dependency>
<dependency>
<groupId>org.dcm4che</groupId>
<artifactId>dcm4che-imageio-opencv</artifactId>
<version>5.21.0</version>
<scope>runtime</scope>
</dependency>
在eclipse里加入opencv的动态链接库(如果你是通过源码编译的dcm4che,在你编译的dcm4che-assembly\target\dcm4che-5.21.0-bin\dcm4che-5.21.0\lib路径下,要是直接从网上下的编译好的直接就在lib目录下),直接在下面的界面
- 开始解压
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import org.dcm4che3.data.Attributes;
import org.dcm4che3.data.UID;
import org.dcm4che3.imageio.codec.Transcoder;
public class Dcm4cheTranscode {
public static void main(String[] args) {
File src = new File("D:/dicomFile/test/11.dcm"); //带有压缩协议的dicom原始文件
File dest = new File("D:/dicomFile/test/33.dcm"); //解压成未压缩的dicom目标文件
try {
transcodeWithTranscoder(src, dest);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void transcodeWithTranscoder(File src, final File dest) throws IOException {
try (Transcoder transcoder = new Transcoder(src)) {
transcoder.setDestinationTransferSyntax(UID.ExplicitVRLittleEndian);
transcoder.transcode(new Transcoder.Handler(){
@Override
public OutputStream newOutputStream(Transcoder transcoder, Attributes dataset) throws IOException {
return new FileOutputStream(dest);
}
});
} catch (Exception e) {
Files.deleteIfExists(dest.toPath());
throw e;
}
}
}
结果:
你会发现解压后的文件比解压前的大很多,我们用第三方dicom文件查看器RadiAnt打开dicom文件发现,两者的图像数据存储格式发生变化了。
11.dcm:
33.dcm:
- 显示
就可以把33.dcm参考我的博客 DCM4CHE图像显示,显示到图片里了。