Come impostare le informazioni DPI in un’immagine?

Ho un’applicazione che voglio esportare immagini ad alta risoluzione (o meglio, pixel ad alta densità?) Per la stampa – ad esempio, voglio immagini che stampino a 250 punti per pollice (DPI), invece del valore predefinito, che capisco per essere 72 DPI.

Sto usando una BufferedImage con un object Graphics2D per disegnare l’immagine, quindi ImageIO.write () per salvare l’immagine.

Qualche idea su come posso impostare il DPI?

La risposta di Kurt ha mostrato il modo in cui, ancora mi ci è voluto un po ‘di tempo per farlo funzionare, quindi ecco il codice che imposta DPI quando si salva un PNG. C’è molto da fare per ottenere gli scrittori appropriati e così …

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); } 

Primo link Google:

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

E sembra che abbia le informazioni di cui hai bisogno.

Ho trovato questo thread nella directory della comunità Oracle:

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

Quindi, sembra che non sia facile come image.setDPI(200, 400) .

sto usando questo codice per il file tiff nel mio progetto e funziona bene ..

 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; } } 

questo è per impostare 300 DPI di immagine Tiff. puoi cambiarlo in base alle tue necessità.

 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 } }); 

Impostazione del DPI TIFF

Se si desidera impostare dpi per TIFF, provare a farlo seguendo i passaggi seguenti:

 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(); } 

Inoltre, in modo simile puoi impostare qualsiasi tag TIFF.

Leggi di più alla fonte