java - ImageIO 保存回原始大小

标签 java graphics awt graphics2d javax.imageio

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

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

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

原始图像是 2x3 英寸图像,而修改后的图像本来应该有 2x3 英寸,遗憾的是却变成了 8x14 英寸。所以,它比原来的更大。

什么解决方案/代码可以为我提供 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 的 IIOMetatada

大致如下:

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

注意:不应逐字使用此代码,但添加迭代、错误处理、流关闭等会使示例变得过于困惑。

参见JPEG Image Metadata DTD有关元数据格式的文档以及您可以控制哪些选项。

关于java - ImageIO 保存回原始大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17616528/

相关文章:

java - 我有两个类,想要从一个类到另一个类获取一个变量

java - 小程序不显示任何内容

java - 计步器读数异常

java - 将数据从 Javascript 传递到 Android WebView

android - Path.offset() 不适用于所有设备

java - 窗口焦点事件的意外行为

java - 将数字转换为用户选择的基数

java - 如何在存储访问框架中设置不常见的文件扩展名?

c++ - 错误,实现绕数算法,(OpenGL,C++)

javascript - 围绕曲线弯曲 SVG `<g>`