【问题标题】:ImageIO saves back to original sizeImageIO 保存回原始大小
【发布时间】:2013-07-11 02:11:41
【问题描述】:

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

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

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

原版是2x3inches-image,而修改后的应该有 2x3inches 的图片很遗憾得到了8x14inches。所以,它比原来的更大了。

什么解决方案/代码可以让我输出 2x3inches-image 仍然具有“良好的质量”?

更新:

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

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 更改分辨率?

【问题讨论】:

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

标签: java graphics awt graphics2d javax.imageio


【解决方案1】:

要设置(JFIF 段的)图像分辨率,您可能可以将IIOMetatada 用于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);
    }
}

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

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

【讨论】:

    猜你喜欢
    • 2011-08-20
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 2011-07-31
    • 1970-01-01
    相关资源
    最近更新 更多