package org.geogebra.desktop.io; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.io.File; import java.io.IOException; import java.util.Iterator; import javax.imageio.IIOImage; import javax.imageio.ImageIO; import javax.imageio.ImageTypeSpecifier; import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.metadata.IIOMetadata; import javax.imageio.metadata.IIOMetadataNode; import javax.imageio.stream.FileImageOutputStream; import org.w3c.dom.NodeList; /** * Extends ImageIO.write() in order to specify the DPI (dots per inch) of the * image. * * @author Markus Hohenwarter */ public class MyImageIO { public static void write(BufferedImage img, String format, float DPI, File outFile) throws IOException { Iterator<ImageWriter> it = ImageIO.getImageWritersByFormatName(format); ImageWriter writer = it.next(); FileImageOutputStream fios = new FileImageOutputStream(outFile); writer.setOutput(fios); writeImage(writer, img, DPI); fios.close(); } public static void writeImage(ImageWriter writer, BufferedImage img, double DPI) throws IOException { float xDPI = (float) DPI; float yDPI = (float) DPI; ImageWriteParam writeParam = writer.getDefaultWriteParam(); RenderedImage ri = img; // set the DPI IIOMetadata destMeta = writer.getDefaultImageMetadata( new ImageTypeSpecifier(ri), writeParam); IIOMetadataNode destNodes = (IIOMetadataNode) destMeta .getAsTree("javax_imageio_1.0"); NodeList nl = destNodes.getElementsByTagName("Dimension"); IIOMetadataNode dim; if ((nl != null) && (nl.getLength() > 0)) { dim = (IIOMetadataNode) nl.item(0); } else { dim = new IIOMetadataNode("Dimension"); destNodes.appendChild(dim); } nl = destNodes.getElementsByTagName("HorizontalPixelSize"); if ((nl == null) || (nl.getLength() == 0)) { IIOMetadataNode horz = new IIOMetadataNode("HorizontalPixelSize"); dim.appendChild(horz); horz.setAttribute("value", Float.toString(xDPI / 25.4f)); } nl = destNodes.getElementsByTagName("VerticalPixelSize"); if ((nl == null) || (nl.getLength() == 0)) { IIOMetadataNode horz = new IIOMetadataNode("VerticalPixelSize"); dim.appendChild(horz); horz.setAttribute("value", Float.toString(yDPI / 25.4f)); } destMeta.setFromTree("javax_imageio_1.0", destNodes); writer.write(null, new IIOImage(ri, null, destMeta), writeParam); // close everything writer.dispose(); } }