ImageIO保存回原始大小

我一直在寻找互联网的一些解决方案,但我仍然没有找到我的问题的答案。

我一直在工作或做一个程序,从我的PC上获取一个图像文件,然后将使用Java Graphics编辑添加一些文本/对象/等。 之后, Java ImageIO将保存新修改的图像。

到目前为止,我能够做得很好,但我对图像的大小有疑问。 原始图像和修改后的图像尺寸不同。

原版是2x3英寸的图像,而修改后的版本据说有2x3英寸太可悲地得到了8x14英寸。 所以,它比原来的更大。

什么是解决方案/代码可以为我提供2×3英寸图像的输出,仍然具有“优质”?

更新:

所以,这是我使用的代码。

 public Picture(String filename) { try { File file = new File("originalpic.jpg"); image = ImageIO.read(file); width = image.getWidth(); } catch (IOException e) { throw new RuntimeException("Could not open file: " + filename); } } private void write(int id) { try { ImageIO.write(image, "jpg", new File("newpic.jpg")); } catch (IOException e) { e.printStackTrace(); } } 

第二次更新:

我现在知道新图像的问题是什么。 当我从Photoshop检查它时,它与原始图像分辨率相比具有不同的图像分辨率。 原始图像为300像素/英寸,而新图像的分辨率为72像素/英寸。

如何使用Java更改分辨率?

要设置(JFIF段的)图像分辨率,您可以使用IIOMetatada for JPEG。

有点像:

 public class MetadataTest { public static void main(String[] args) throws IOException { BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_3BYTE_BGR); ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next(); writer.setOutput(ImageIO.createImageOutputStream(new File("foo.jpg"))); ImageWriteParam param = writer.getDefaultWriteParam(); IIOMetadata metadata = writer.getDefaultImageMetadata(ImageTypeSpecifier.createFromRenderedImage(image), param); IIOMetadataNode root = (IIOMetadataNode) metadata.getAsTree(metadata.getNativeMetadataFormatName()); IIOMetadataNode jfif = (IIOMetadataNode) root.getElementsByTagName("app0JFIF").item(0); jfif.setAttribute("resUnits", "1"); jfif.setAttribute("Xdensity", "300"); jfif.setAttribute("Ydensity", "300"); metadata.mergeTree(metadata.getNativeMetadataFormatName(), root); writer.write(null, new IIOImage(image, null, metadata), param); } } 

注意:不应该逐字使用此代码,但添加迭代,error handling,流关闭等会使示例过于混乱。

有关元数据格式的文档以及可以控制的选项,请参阅JPEG Image Metadata DTD 。