¿Cómo establecer información DPI en una imagen?

Tengo una aplicación que deseo exportar imágenes de alta resolución (¿o mejor, densidad de píxeles alta?) Para imprimir, por ejemplo, quiero imágenes que impriman a 250 puntos por pulgada (DPI), en lugar de las predeterminadas, lo que entiendo para ser 72 DPI.

Estoy usando una Imagen Buffered con un objeto Graphics2D para dibujar la imagen, luego ImageIO.write () para guardar la imagen.

¿Alguna idea de cómo puedo configurar el DPI?

La respuesta de Kurt mostró el camino, aún me tomó bastante tiempo ejecutarlo, así que aquí está el código que establece DPI al guardar un PNG. Hay mucho que hacer para obtener los escritores adecuados y tal …

private BufferedImage gridImage; ... private void saveGridImage(File output) throws IOException { output.delete(); final String formatName = "png"; for (Iterator iw = ImageIO.getImageWritersByFormatName(formatName); iw.hasNext();) { ImageWriter writer = iw.next(); ImageWriteParam writeParam = writer.getDefaultWriteParam(); ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB); IIOMetadata metadata = writer.getDefaultImageMetadata(typeSpecifier, writeParam); if (metadata.isReadOnly() || !metadata.isStandardMetadataFormatSupported()) { continue; } setDPI(metadata); final ImageOutputStream stream = ImageIO.createImageOutputStream(output); try { writer.setOutput(stream); writer.write(metadata, new IIOImage(gridImage, null, metadata), writeParam); } finally { stream.close(); } break; } } private void setDPI(IIOMetadata metadata) throws IIOInvalidTreeException { // for PMG, it's dots per millimeter double dotsPerMilli = 1.0 * DPI / 10 / INCH_2_CM; IIOMetadataNode horiz = new IIOMetadataNode("HorizontalPixelSize"); horiz.setAttribute("value", Double.toString(dotsPerMilli)); IIOMetadataNode vert = new IIOMetadataNode("VerticalPixelSize"); vert.setAttribute("value", Double.toString(dotsPerMilli)); IIOMetadataNode dim = new IIOMetadataNode("Dimension"); dim.appendChild(horiz); dim.appendChild(vert); IIOMetadataNode root = new IIOMetadataNode("javax_imageio_1.0"); root.appendChild(dim); metadata.mergeTree("javax_imageio_1.0", root); } 

Primer enlace de Google:

http://www.tracemodeler.com/articles/aging-bugs-and-setting-dpi-with-java-image-io/

Y parece que tiene la información que necesita.

Encontré este hilo en el directorio de comunidad de Oracle:

https://community.oracle.com/thread/1265028?tstart=0

Por lo tanto, parece que no es tan fácil como image.setDPI(200, 400) .

Estoy usando este código para el archivo tiff en mi proyecto y funciona bien …

 import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import javax.imageio.ImageIO; import javax.media.jai.NullOpImage; import javax.media.jai.OpImage; import javax.media.jai.PlanarImage; import com.sun.media.jai.codec.FileSeekableStream; import com.sun.media.jai.codec.ImageCodec; import com.sun.media.jai.codec.ImageDecoder; import com.sun.media.jai.codec.ImageEncoder; import com.sun.media.jai.codec.SeekableStream; import com.sun.media.jai.codec.TIFFEncodeParam; import com.sun.media.jai.codec.TIFFField; class SetDDPI { static void tiff_Maker(List output, String result) throws IOException { TIFFEncodeParam params = new TIFFEncodeParam(); OutputStream out = new FileOutputStream(result); List imageList = new ArrayList(); for (int i = 1; i < output.size(); i++) { imageList.add(output.get(i)); } params.setWriteTiled(true); params.setCompression(TIFFEncodeParam.COMPRESSION_GROUP4); params.setExtraImages(imageList.iterator()); TIFFField[] extras = new TIFFField[2]; extras[0] = new TIFFField(282, TIFFField.TIFF_RATIONAL, 1, (Object) new long[][] { { (long) 300, (long) 1 }, { (long) 0, (long) 0 } }); extras[1] = new TIFFField(283, TIFFField.TIFF_RATIONAL, 1, (Object) new long[][] { { (long) 300, (long) 1 }, { (long) 0, (long) 0 } }); params.setExtraFields(extras); ImageEncoder encoder = ImageCodec.createImageEncoder("tiff", out, params); encoder.encode(output.get(0)); out.close(); } static List tiff_Extractor(File tiff) throws IOException { List images = new ArrayList(); SeekableStream ss = new FileSeekableStream(tiff); ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", ss, null); int numPages = decoder.getNumPages(); for (int j = 0; j < numPages; j++) { PlanarImage op = new NullOpImage(decoder.decodeAsRenderedImage(j), null, null, OpImage.OP_IO_BOUND); images.add(op.getAsBufferedImage()); } return images; } } 

esto es para establecer 300 DPI de la imagen de Tiff. puedes cambiarlo de acuerdo a tu necesidad

 extras[0] = new TIFFField(282, TIFFField.TIFF_RATIONAL, 1, (Object) new long[][] { { (long) 300, (long) 1 },{ (long) 0, (long) 0 } }); extras[1] = new TIFFField(283, TIFFField.TIFF_RATIONAL, 1, (Object) new long[][] { { (long) 300, (long) 1 },{ (long) 0, (long) 0 } }); 

Configurar TIFF DPI

Si desea establecer dpi para TIFF, intente hacerlo con los siguientes pasos:

 private static IIOMetadata createMetadata(ImageWriter writer, ImageWriteParam writerParams, int resolution) throws IIOInvalidTreeException { // Get default metadata from writer ImageTypeSpecifier type = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_BYTE_GRAY); IIOMetadata meta = writer.getDefaultImageMetadata(type, writerParams); // Convert default metadata to TIFF metadata TIFFDirectory dir = TIFFDirectory.createFromMetadata(meta); // Get {X,Y} resolution tags BaselineTIFFTagSet base = BaselineTIFFTagSet.getInstance(); TIFFTag tagXRes = base.getTag(BaselineTIFFTagSet.TAG_X_RESOLUTION); TIFFTag tagYRes = base.getTag(BaselineTIFFTagSet.TAG_Y_RESOLUTION); // Create {X,Y} resolution fields TIFFField fieldXRes = new TIFFField(tagXRes, TIFFTag.TIFF_RATIONAL, 1, new long[][] { { resolution, 1 } }); TIFFField fieldYRes = new TIFFField(tagYRes, TIFFTag.TIFF_RATIONAL, 1, new long[][] { { resolution, 1 } }); // Add {X,Y} resolution fields to TIFFDirectory dir.addTIFFField(fieldXRes); dir.addTIFFField(fieldYRes); // Return TIFF metadata so it can be picked up by the IIOImage return dir.getAsMetadata(); } 

Además, de forma similar, puede configurar cualquier etiqueta TIFF.

Lea más en la fuente