Java ImageIO保存回原始大小

Java ImageIO保存回原始大小,java,graphics,awt,graphics2d,javax.imageio,Java,Graphics,Awt,Graphics2d,Javax.imageio,我一直在网上寻找一些解决方案,但我仍然没有找到我的问题的答案 我一直在工作或做一个程序,从我的电脑中获取一个图像文件,然后使用Java Graphics进行编辑,添加一些文本/对象等。之后,Java ImageIO将保存新修改的图像 到目前为止,我能够做得很好,但我遇到了一个关于图像大小的问题。原始图像和修改后的图像大小不同 原来的是一幅2x3inches的图像,而修改后的那幅图像应该是2x3英寸,但很遗憾,它得到了8x14inches。所以,它比原来的更大了 什么样的解决方案/代码可以让我输出

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

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

到目前为止,我能够做得很好,但我遇到了一个关于图像大小的问题。原始图像和修改后的图像大小不同

原来的是一幅
2x3
inches的图像,而修改后的那幅图像应该是2x3英寸,但很遗憾,它得到了
8x14
inches。所以,它比原来的更大了

什么样的解决方案/代码可以让我输出2x3英寸的图像,并且仍然具有“良好的质量”

更新:

这是我使用的代码

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段的)图像分辨率,您可能可以使用JPEG的
iimetatada

大致如下:

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);
    }
}
注意:此代码不应逐字使用,但添加迭代、错误处理、流关闭等操作会使示例过于混乱。


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

问题有点笼统,但我猜您正在使用不同DPI设置的格式进行保存。发布一些代码,我们可以尝试提供帮助。请发布您的问题。奇怪。图形2D上的每个变换都应使用逆变换进行镜像。我不知道,但这似乎是唯一的解释。需要剪辑吗?我编辑了你的问题,添加了一个..问题。如果这不是问题,请相应地用你自己的。我更新了我上面的帖子,并添加了我使用的代码。