DICOM檔案裝換成圖片
阿新 • • 發佈:2019-01-02
Dcm2Jpeg
圖片轉換類
import java.awt.image.BufferedImage; import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.util.Iterator; import java.util.List; import javax.imageio.ImageIO; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.GnuParser; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.OptionBuilder; import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; import org.dcm4che2.data.DicomObject; import org.dcm4che2.imageio.plugins.dcm.DicomImageReadParam; import org.dcm4che2.io.DicomInputStream; import org.dcm4che2.util.CloseUtils; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; /** * @author * @version $Revision$ $Date$ * @since saoye 04, 2017 */ public class Dcm2Jpeg { private static final String USAGE = "dcm2jpg [Options] <dcmfile> <jpegfile>\n" + "or dcm2jpg [Options] <dcmfile>... <outdir>\n" + "or dcm2jpg [Options] <indir>... <outdir>"; private static final String DESCRIPTION = "Convert DICOM image(s) to JPEG(s)\nOptions:"; private static final String EXAMPLE = null; private int frame = 1; private float center; private float width; private String vlutFct; private boolean autoWindowing; private DicomObject prState; private short[] pval2gray; private String fileExt = ".jpg"; private void setFrameNumber(int frame) { this.frame = frame; } private void setWindowCenter(float center) { this.center = center; } private void setWindowWidth(float width) { this.width = width; } public final void setVoiLutFunction(String vlutFct) { this.vlutFct = vlutFct; } private final void setAutoWindowing(boolean autoWindowing) { this.autoWindowing = autoWindowing; } private final void setPresentationState(DicomObject prState) { this.prState = prState; } private final void setPValue2Gray(short[] pval2gray) { this.pval2gray = pval2gray; } public final void setFileExt(String fileExt) { this.fileExt = fileExt; } public void convert(File src, File dest) throws IOException { Iterator<ImageReader> iter = ImageIO.getImageReadersByFormatName("DICOM"); ImageReader reader = iter.next(); DicomImageReadParam param = (DicomImageReadParam) reader.getDefaultReadParam(); param.setWindowCenter(center); param.setWindowWidth(width); param.setVoiLutFunction(vlutFct); param.setPresentationState(prState); param.setPValue2Gray(pval2gray); param.setAutoWindowing(autoWindowing); ImageInputStream iis = ImageIO.createImageInputStream(src); BufferedImage bi; OutputStream out = null; try { reader.setInput(iis, false); bi = reader.read(frame - 1, param); if (bi == null) { System.out.println("\nError: " + src + " - couldn't read!"); return; } out = new BufferedOutputStream(new FileOutputStream(dest)); JPEGImageEncoder enc = JPEGCodec.createJPEGEncoder(out); enc.encode(bi); } finally { CloseUtils.safeClose(iis); CloseUtils.safeClose(out); } //System.out.print('.'); } public int mconvert(List<String> args, int optind, File destDir) throws IOException { int count = 0; for (int i = optind, n = args.size() - 1; i < n; ++i) { File src = new File(args.get(i)); count += mconvert(src, new File(destDir, src2dest(src))); } return count; } private String src2dest(File src) { String srcname = src.getName(); return src.isFile() ? srcname + this.fileExt : srcname; } public int mconvert(File src, File dest) throws IOException { if (!src.exists()) { System.err.println("WARNING: No such file or directory: " + src + " - skipped."); return 0; } if (src.isFile()) { try { convert(src, dest); } catch (Exception e) { System.err.println("WARNING: Failed to convert " + src + ":"); e.printStackTrace(System.err); System.out.print('F'); return 0; } System.out.print('.'); return 1; } File[] files = src.listFiles(); if (files.length > 0 && !dest.exists()) { dest.mkdirs(); } int count = 0; for (int i = 0; i < files.length; ++i) { count += mconvert(files[i], new File(dest, src2dest(files[i]))); } return count; } @SuppressWarnings("unchecked") public static void main(String args[]) throws Exception { CommandLine cl = parse(args); Dcm2Jpeg dcm2jpg = new Dcm2Jpeg(); if (cl.hasOption("f")) { dcm2jpg.setFrameNumber( parseInt(cl.getOptionValue("f"), "illegal argument of option -f", 1, Integer.MAX_VALUE)); } if (cl.hasOption("p")) { dcm2jpg.setPresentationState(loadDicomObject( new File(cl.getOptionValue("p")))); } if (cl.hasOption("pv2gray")) { dcm2jpg.setPValue2Gray(loadPVal2Gray( new File(cl.getOptionValue("pv2gray")))); } if (cl.hasOption("c")) { dcm2jpg.setWindowCenter( parseFloat(cl.getOptionValue("c"), "illegal argument of option -c")); } if (cl.hasOption("w")) { dcm2jpg.setWindowWidth( parseFloat(cl.getOptionValue("w"), "illegal argument of option -w")); } if (cl.hasOption("sigmoid")) { dcm2jpg.setVoiLutFunction(DicomImageReadParam.SIGMOID); } dcm2jpg.setAutoWindowing(!cl.hasOption("noauto")); if (cl.hasOption("jpgext")) { dcm2jpg.setFileExt(cl.getOptionValue("jpgext")); } final List<String> argList = cl.getArgList(); int argc = argList.size(); File dest = new File(argList.get(argc-1)); long t1 = System.currentTimeMillis(); int count = 1; if (dest.isDirectory()) { count = dcm2jpg.mconvert(argList, 0, dest); } else { File src = new File(argList.get(0)); if (argc > 2 || src.isDirectory()) { exit("dcm2jpg: when converting several files, " + "last argument must be a directory\n"); } dcm2jpg.convert(src, dest); } long t2 = System.currentTimeMillis(); System.out.println("\nconverted " + count + " files in " + (t2 - t1) / 1000f + " s."); } private static DicomObject loadDicomObject(File file) { DicomInputStream in = null; try { in = new DicomInputStream(file); return in.readDicomObject(); } catch (IOException e) { exit(e.getMessage()); throw new RuntimeException(); } finally { CloseUtils.safeClose(in); } } private static short[] loadPVal2Gray(File file) { BufferedReader r = null; try { r = new BufferedReader(new InputStreamReader(new FileInputStream( file))); short[] pval2gray = new short[256]; int n = 0; String line; while ((line = r.readLine()) != null) { try { int val = Integer.parseInt(line.trim()); if (n == pval2gray.length) { if (n == 0x10000) { exit("Number of entries in " + file + " > 2^16"); } short[] tmp = pval2gray; pval2gray = new short[n << 1]; System.arraycopy(tmp, 0, pval2gray, 0, n); } pval2gray[n++] = (short) val; } catch (NumberFormatException nfe) { // ignore lines where Integer.parseInt fails } } if (n != pval2gray.length) { exit("Number of entries in " + file + ": " + n + " != 2^[8..16]"); } return pval2gray; } catch (IOException e) { exit(e.getMessage()); throw new RuntimeException(); } finally { CloseUtils.safeClose(r); } } private static CommandLine parse(String[] args) { Options opts = new Options(); OptionBuilder.withArgName("frame"); OptionBuilder.hasArg(); OptionBuilder.withDescription( "幀轉換,1(=第一幀)預設"); opts.addOption(OptionBuilder.create("f")); OptionBuilder.withArgName("prfile"); OptionBuilder.hasArg(); OptionBuilder.withDescription( "申請狀態的檔案路徑"); opts.addOption(OptionBuilder.create("p")); OptionBuilder.withArgName("center"); OptionBuilder.hasArg(); OptionBuilder.withDescription("Window Center"); opts.addOption(OptionBuilder.create("c")); OptionBuilder.withArgName("width"); OptionBuilder.hasArg(); OptionBuilder.withDescription("Window Width"); opts.addOption(OptionBuilder.create("w")); opts.addOption("sigmoid", false, "應用乙狀結腸VOI LUT函式給定視窗中心/寬度"); opts.addOption("noauto", false, "disable視窗W /自我形象或你的屬性。"); OptionBuilder.withArgName("file"); OptionBuilder.hasArg(); OptionBuilder.withDescription( "P值的灰度值對映檔案的路徑"); opts.addOption(OptionBuilder.create("pv2gray")); OptionBuilder.withArgName(".xxx"); OptionBuilder.hasArg(); OptionBuilder.withDescription( "使用目標目錄引數的JPEG副檔名," + " default: '.jpg'."); opts.addOption(OptionBuilder.create("jpgext")); opts.addOption("h", "help", false, "列印資訊"); opts.addOption("V", "version", false, "列印版本資訊並退出"); CommandLine cl = null; try { cl = new GnuParser().parse(opts, args); } catch (ParseException e) { exit("dcm2jpg: " + e.getMessage()); throw new RuntimeException("unreachable"); } if (cl.hasOption('V')) { Package p = Dcm2Jpeg.class.getPackage(); System.out.println("dcm2jpg v" + p.getImplementationVersion()); System.exit(0); } if (cl.hasOption('h') || cl.getArgList().size() < 2) { HelpFormatter formatter = new HelpFormatter(); formatter.printHelp(USAGE, DESCRIPTION, opts, EXAMPLE); System.exit(0); } return cl; } private static int parseInt(String s, String errPrompt, int min, int max) { try { int i = Integer.parseInt(s); if (i >= min && i <= max) return i; } catch (NumberFormatException e) { // parameter is not a valid integer; fall through to exit } exit(errPrompt); throw new RuntimeException(); } private static float parseFloat(String s, String errPrompt) { try { return Float.parseFloat(s); } catch (NumberFormatException e) { exit(errPrompt); throw new RuntimeException(); } } private static void exit(String msg) { System.err.println(msg); System.err.println("“嘗試”dcm2jpg - H的更多資訊。"); System.exit(1); } }
來一小dome 測試一下
import java.io.File; import java.io.IOException; import java.util.logging.Logger; public class Dcm2JpgTest { public static void main(String[] args) throws IOException { try{ File src = new File("D:/test/1.2.840.113704.1.111.9504.1466556503.1_21.dcm"); File dest = new File("D:/test/1.2.840.113704.1.111.9504.1466556503.1_21.jpeg"); Dcm2Jpeg dcm2jpg= new Dcm2Jpeg(); dcm2jpg.convert(src, dest); } catch(IOException e){ e.printStackTrace(); } catch(Exception e){ e.printStackTrace(); } } }
以下是用到的dicom和jar包
連結:http://pan.baidu.com/s/1kVdqYLh 密碼:gfz8