package ij.plugin; import ij.*; import ij.process.*; import ij.io.FileSaver; import java.awt.image.*; import java.awt.*; import java.io.*; import java.util.Iterator; import javax.imageio.*; import javax.imageio.stream.*; /** The File/Save As/Jpeg command (FileSaver.saveAsJpeg() method) uses this plugin to save images in JPEG format. */ public class JpegWriter implements PlugIn { public static final int DEFAULT_QUALITY = 75; public void run(String arg) { ImagePlus imp = WindowManager.getCurrentImage(); if (imp==null) return; imp.startTiming(); saveAsJpeg(imp,arg,FileSaver.getJpegQuality()); IJ.showTime(imp, imp.getStartTime(), "JpegWriter: "); } /** Thread-safe method. */ public static String save(ImagePlus imp, String path, int quality) { imp.startTiming(); String error = (new JpegWriter()).saveAsJpeg(imp, path, quality); IJ.showTime(imp, imp.getStartTime(), "JpegWriter: "); return error; } String saveAsJpeg(ImagePlus imp, String path, int quality) { int width = imp.getWidth(); int height = imp.getHeight(); int biType = BufferedImage.TYPE_INT_RGB; boolean overlay = imp.getOverlay()!=null && !imp.getHideOverlay(); if (imp.getProcessor().isDefaultLut() && !imp.isComposite() && !overlay) biType = BufferedImage.TYPE_BYTE_GRAY; BufferedImage bi = new BufferedImage(width, height, biType); String error = null; try { Graphics g = bi.createGraphics(); Image img = imp.getImage(); if (overlay) img = imp.flatten().getImage(); g.drawImage(img, 0, 0, null); g.dispose(); Iterator iter = ImageIO.getImageWritersByFormatName("jpeg"); ImageWriter writer = (ImageWriter)iter.next(); File f = new File(path); String originalPath = null; boolean replacing = f.exists(); if (replacing) { originalPath = path; path += ".temp"; f = new File(path); } ImageOutputStream ios = ImageIO.createImageOutputStream(f); writer.setOutput(ios); ImageWriteParam param = writer.getDefaultWriteParam(); param.setCompressionMode(param.MODE_EXPLICIT); param.setCompressionQuality(quality/100f); if (quality == 100) param.setSourceSubsampling(1, 1, 0, 0); IIOImage iioImage = new IIOImage(bi, null, null); writer.write(null, iioImage, param); ios.close(); writer.dispose(); if (replacing) { File f2 = new File(originalPath); boolean ok = f2.delete(); if (ok) f.renameTo(f2); } } catch (Exception e) { error = ""+e; IJ.error("Jpeg Writer", ""+error); } return error; } /** * @deprecated * replaced by FileSaver.setJpegQuality() */ public static void setQuality(int jpegQuality) { FileSaver.setJpegQuality(jpegQuality); } /** * @deprecated * replaced by FileSaver.getJpegQuality() */ public static int getQuality() { return FileSaver.getJpegQuality(); } }