package club.kittybunny.tool.dcmfile;
import org.dcm4che3.data.Attributes;
import org.dcm4che3.imageio.plugins.dcm.DicomImageReadParam;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;public classDcm2Jpg2 {private final ImageReader imageReader = ImageIO.getImageReadersByFormatName("DICOM").next();private floatwindowCenter;private floatwindowWidth;private boolean autoWindowing = true;private intwindowIndex;private intvoiLutIndex;private boolean preferWindow = true;privateAttributes prState;private int overlayActivationMask = 0xffff;private int overlayGrayscaleValue = 0xffff;private int frame = 1;/**
* 通过制定源文件目录和目标文件目录,实现dcm转jpg格式
* @param args
* @throws Exception*/
public static voidmain(String[] args) throws Exception {//源文件加目录全路径,结尾用/结束,只处理里面dcm格式文件 ,例如"/home/bunny/桌面/src/"
String src = "/home/bunny/Downloads/qq-files/1023354682/file_recv/3000566.000000-03192/";//目标路径全路径,将源文件加内所有dcm文件转换为同名jpg文件,使用/结束,;例如 "/home/bunny/桌面/w/dcm/"
String out = "/home/bunny/桌面/w/dcm/";if (args.length >= 2) {
src= args[0];out = args[1];
}
File f= newFile(src);//读取到所有文件名
String[] arr =f.list();for (int i = 0; i < arr.length; i++) {//筛选符合条件的文件处理
if (arr[i].endsWith(".dcm")) {
InputStreamin = new FileInputStream(src +arr[i]);
ByteArrayOutputStream byteArrayOutputStream= new Dcm2Jpg2().convert(in, null);
FileOutputStream fileOutputStream= null;try{
fileOutputStream= new FileOutputStream(out + arr[i].substring(0, arr[i].lastIndexOf("."))+".jpg");
fileOutputStream.write(byteArrayOutputStream.toByteArray());
}catch(IOException e) {
e.printStackTrace();
}
}
}
}/**
*
* 实现单文件的dcm转jpg
* @param src dcm文件流
* @param name oss的getFileName
* @throws Exception*/
publicByteArrayOutputStream convert(InputStream src, String name) throws Exception {
Iterator iter = ImageIO.getImageReadersByFormatName("DICOM");
ImageReader reader=iter.next();try (ImageInputStream iis =ImageIO.createImageInputStream(src)) {
reader.setInput(iis,false);
BufferedImage bi=readImage(iis);if (bi == null) {throw new Exception("无法读取到图片");
}
ByteArrayOutputStream os= newByteArrayOutputStream();
ImageIO.write(bi,"jpg", os);returnos;
}catch(IOException e) {
e.printStackTrace();return null;
}
}privateImageReadParam 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);returnparam;
}privateBufferedImage readImage(ImageInputStream iis) throws IOException {
imageReader.setInput(iis);return imageReader.read(frame - 1, readParam());
}
}