这很棘手,因为就像Java中的许多事情一样,您不能仅以简单的方式访问某些内容。Java不会跟踪DPI,但是会使用每毫米的点数。另外,另一个令人困惑的部分是您不能更改图像或BufferedImage中的此类信息。仅当通过ImageWriter写入BufferedImage时,才能更改此信息。
我能够做到这一点。如我所说,我可以指定返回给我的图像的缩放比例。无论缩放级别如何,输出均为72
DPI。我的目标是300DPI。我指定了400%的缩放比例。因此,在8英寸宽,72 DPI的图像上,向我返回了32英寸72
DPI的图像。我要做的就是将DPI指定为288(72 x 4),以覆盖我正在处理的默认72
DPI,然后在将其写出时,图像具有相同数量的像素,但被认为是在288 DPI,而不是72 DPI。
这是一个代码片段:
//假设已经有一个ImageWriter iw
ImageWriteParam writeParam = writer.getDefaultWriteParam();ImageTypeSpecifier typeSpecifier = ImageTypeSpecifier.createFromBufferedImageType(BufferedImage.TYPE_INT_RGB);IIOmetadata metadata = writer.getDefaultImagemetadata(typeSpecifier, writeParam);if (metadata.isReadonly() || !metadata.isStandardmetadataFormatSupported()) { continue;}//设置参数和信息
int DPI = 72 * scaling/100;double dotsPerMilli = 1.0 * DPI / 10 / 2.54;double checkDots = 1.0 * 144 / 10 / 2.54;System.out.println("Dots per inch: " + DPI + ", DotsPerMilli: " + dotsPerMilli + ", CheckDots = " + checkDots);IIOmetadataNode root = new IIOmetadataNode("javax_imageio_1.0");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);root.appendChild(dim);metadata.mergeTree("javax_imageio_1.0", root);//从这里开始,只需使用ImageOutputStream写出文件
final ImageOutputStream stream = ImageIO.createImageOutputStream(outFile);System.out.println("Output file: " + outFile);try { writer.setOutput(ImageIO.createImageOutputStream(outFile)); writer.write(metadata, new IIOImage(image_to_save, null, metadata), writeParam);} catch (Exception e) { System.out.println("Caught exception " + e + " when trying to write out file."); System.exit(0);} finally { stream.close();}


