如何在图像中设置DPI信息?

我有一个应用程序,我想导出高分辨率(或更确切地说,高像素密度?)图像用于打印 – 例如,我想要以每英寸250点(DPI)打印的图像,而不是我理解的默认值为72 DPI。

我正在使用带有Graphics2D对象的BufferedImage来绘制图像,然后使用ImageIO.write()来保存图像。

知道如何设置DPI吗?

Kurt的回答显示了这种方式,仍然花了我相当长的时间来运行它,所以这里是保存PNG时设置DPI的代码。 要找到合适的作家,还有很多工作要做……

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

第一个谷歌链接:

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

看起来它拥有您需要的信息。

我在Oracle社区目录上找到了这个post:

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

所以,看起来它并不像image.setDPI(200, 400)那么容易。

我在我的项目中使用此代码用于tiff文件,它运行良好..

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

这是设置300 DPI的Tiff图像。 你可以根据需要改变它。

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

设置TIFF DPI

如果要为TIFF设置dpi,请尝试按以下步骤操作:

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

此外,您可以设置任何TIFF标记的类似方式。

在源头阅读更多内容