dcm4che概述
dcm4che是爲專注於醫療健康企業開發的基於DICOM標準的開源應用和工具的集合。目前最新的版本是dcm4che3.3.8。本片文章主要講的是使用dcm4che3.3.8解析DICOM文件生成JPEG圖像文件。
運行環境
java:jre1.8.0_131,jdk1.8.0_131;
注:使用的是32位java運行環境,因爲之前使用的是64位,然後生成JPEG時出現不能生成等錯誤(具體錯誤記不清楚了),需要使用32位環境然後安裝一些java的其他的環境。
jar包
dcm4che3.3.8:
- dcm4che-image-3.3.8.jar
- dcm4che-imageio-3.3.8.jar
- dcm4che-tool-dcm2jpg-3.3.8.jar
- dcm4che-core-3.3.8.jar
log4j:
- log4j-1.2.17.jar
- slf4j-api-1.7.5.jar
- slf4j-log4j12-1.7.5.jar
具體實現
主要由兩個.java構成,Dcm2jpgIOStreamOutput.java和Dcm2JpgMain.java。
Dcm2jpgIOStreamOutput.java:
import java.awt.image.BufferedImage;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import org.dcm4che3.data.Attributes;
import org.dcm4che3.imageio.plugins.dcm.DicomImageReadParam;
import org.dcm4che3.util.SafeClose;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
public class Dcm2jpgIOStreamOutput {
private final ImageReader imageReader = ImageIO.getImageReadersByFormatName("DICOM").next();
private float windowCenter;
private float windowWidth;
private boolean autoWindowing = true;
private int windowIndex;
private int voiLUTIndex;
private boolean preferWindow = true;
private Attributes prState;
private int overlayActivationMask = 0xffff;
private int overlayGrayscaleValue = 0xffff;
private int frame = 1;
public int getFrame() {
return frame;
}
public void setFrame(int frame) {
this.frame = frame;
}
public void setWindowCenter(float windowCenter) {
this.windowCenter = windowCenter;
}
public void setWindowWidth(float windowWidth) {
this.windowWidth = windowWidth;
}
public void setAutoWindowing(boolean autoWindowing) {
this.autoWindowing = autoWindowing;
}
public void setWindowIndex(int windowIndex) {
this.windowIndex = windowIndex;
}
public void setVoiLUTIndex(int voiLUTIndex) {
this.voiLUTIndex = voiLUTIndex;
}
public void setPreferWindow(boolean preferWindow) {
this.preferWindow = preferWindow;
}
public void setPrState(Attributes prState) {
this.prState = prState;
}
public void setOverlayActivationMask(int overlayActivationMask) {
this.overlayActivationMask = overlayActivationMask;
}
public void setOverlayGrayscaleValue(int overlayGrayscaleValue) {
this.overlayGrayscaleValue = overlayGrayscaleValue;
}
public void convert(File src, File dest) throws IOException{
Iterator<ImageReader> iter = ImageIO.getImageReadersByFormatName("DICOM");
ImageReader reader = iter.next();
ImageInputStream iis = ImageIO.createImageInputStream(src);
BufferedImage bi;
OutputStream out = null;
try{
reader.setInput(iis, false);
bi = readImage(iis);
if (bi == null) {
System.out.println("\nError: " + src + " - couldn't read!");
return;
}
out = new BufferedOutputStream(new FileOutputStream(dest));
JPEGImageEncoder enc = JPEGCodec.createJPEGEncoder(out); //這裏也可以使用流將圖像導出到web應用,用來搭建web版的PACS等。
enc.encode(bi);
}finally{
SafeClose.close(iis);
SafeClose.close(out);
}
}
private ImageReadParam readParam(){
DicomImageReadParam param = (DicomImageReadParam) imageReader.getDefaultReadParam();
param.setWindowCenter(windowCenter);
param.setWindowWidth(windowWidth);
param.setAutoWindowing(autoWindowing);
param.setWindowIndex(windowIndex);
param.setVOILUTIndex(voiLUTIndex);
param.setPreferWindow(preferWindow);
param.setPresentationState(prState);
param.setOverlayActivationMask(overlayActivationMask);
param.setOverlayGrayscaleValue(overlayGrayscaleValue);
return param;
}
private BufferedImage readImage(ImageInputStream iis) throws IOException{
imageReader.setInput(iis);
return imageReader.read(frame -1, readParam());
}
}
Dcm2JpgMain.java:
import java.io.File;
import java.io.IOException;
public class Dcm2JpgMain {
public static void main(String[] args) throws IOException {
try{
for(int i = 1;i < 2;i++){
System.out.print("No: " + String.format("%06d", i) + " Started ");
String tempStr = String.format("%06d", i);
File src = new File("F:\\dicomfiles\\LIDC-IDRI-0827\\1.3.6.1.4.1.14519.5.2.1.6279.6001.728284743932342406301468721019\\1.3.6.1.4.1.14519.5.2.1.6279.6001.253322967203074795232627653819\\" + tempStr + ".dcm"); //這裏我原本測試的是大概400個dcm文件,最後一次測試只實驗了一張,這裏填上dcm文件的具體位置就行。
File dest = new File("F:\\dicomfiles\\dcm2jpg\\" + tempStr + ".jpg"); //生成的JPEG圖像位置
Dcm2jpgIOStreamOutput dcm2jpg = new Dcm2jpgIOStreamOutput();
dcm2jpg.convert(src, dest);
System.out.println("------> Result:Completed");
}
}catch(IOException e){
e.printStackTrace();
}catch(Exception e){
e.printStackTrace();
}
}
}
Q: 690567521