2

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

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

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

原始图像是2x3英寸图像,而修改后的图像据说是 2x3 英寸,遗憾的是得到了8x14英寸。所以,它比原来的更大。

什么解决方案/代码可以让我输出 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 更改分辨率?

4

1 回答 1

4

To set the image resolution (of the JFIF segment), you can probably use the IIOMetatada for JPEG.

Something along the lines of:

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

Note: this code should not be used verbatim, but adding iteration, error handling, stream closing etc, clutters the example too much.

See JPEG Image Metadata DTD for documentation on the metadata format, and what options you can control.

于 2013-07-15T08:36:18.910 回答