【问题标题】:Storing DPI and Paper Size information in a JPEG with Java使用 Java 将 DPI 和纸张大小信息存储在 JPEG 中
【发布时间】:2012-01-26 23:22:56
【问题描述】:

我有以下代码:

ImageIO.write(originalImage, OUTPUT_TYPE, resultOutput);

这是对以下javax.imageio.ImageIO 方法的调用:

public static boolean write(RenderedImage im,
                            String formatName,
                            File output)
                     throws IOException

这会将原始 BMP 图像转换为 JGP 输出。是否也可以在 JPEG 中存储 DPI 和纸张尺寸信息以帮助打印操作?

【问题讨论】:

    标签: java jpeg dpi javax.imageio


    【解决方案1】:

    我找到了这个post for setting DPI on PNG Files。它指出您应该使用“metadata.mergeTree”来正确保存您的元数据。

    考虑到这一点,这里有一些工作正常的代码,它采用 BMP 文件并以任意 DPI 创建一个 JPG 文件:

    import java.awt.image.BufferedImage
    import java.io.File
    import java.util.Hashtable
    import java.util.Map
    import javax.imageio.*
    import javax.imageio.stream.*
    import javax.imageio.metadata.*
    import javax.imageio.plugins.jpeg.*
    import org.w3c.dom.*
    
    File sourceFile = new File("sample.bmp")
    File destinationFile = new File("sample.jpg")
    
    dpi = 100
    
    BufferedImage sourceImage = ImageIO.read(sourceFile)
    ImageWriter imageWriter = ImageIO.getImageWritersBySuffix("jpeg").next();
    ImageOutputStream ios = ImageIO.createImageOutputStream(destinationFile);
    imageWriter.setOutput(ios);
    def jpegParams = imageWriter.getDefaultWriteParam();
    
    IIOMetadata data = imageWriter.getDefaultImageMetadata(new ImageTypeSpecifier(sourceImage), jpegParams);
    Element tree = (Element)data.getAsTree("javax_imageio_jpeg_image_1.0");
    Element jfif = (Element)tree.getElementsByTagName("app0JFIF").item(0);
    jfif.setAttribute("Xdensity", Integer.toString(dpi));
    jfif.setAttribute("Ydensity", Integer.toString(dpi));
    jfif.setAttribute("resUnits", "1"); // density is dots per inch                 
    data.mergeTree("javax_imageio_jpeg_image_1.0",tree)
    
    // Write and clean up
    imageWriter.write(data, new IIOImage(sourceImage, null, data), jpegParams);
    ios.close();
    imageWriter.dispose();
    

    在 OSX 的 Preview 应用程序和 Gimp 中对我来说工作得很好,它们都报告说生成的图像是 100 DPI。至于纸张尺寸......我想这直接由DPI决定?我找不到任何可以设置该特定值的 JPEG 属性。

    【讨论】:

    • 纸张尺寸是使用 dpi 和像素尺寸自动计算的。无需在元数据中设置。在 PhotoShop 和一些打印机客户端上进行了验证。
    【解决方案2】:

    您可以考虑使用 Commons Sanselan,而不是 ImageIO 来完成此任务。

    请参阅http://commons.apache.org/sanselan/whysanselan.html 了解更多信息。

    【讨论】:

    • 是的,这似乎是一个很好的解决方案,可以写:screaming-penguin.com/node/7485
    • 这在 sanselan 中不起作用:将 BMP 转换为 JPG。也许它只对修改/添加 exif 类型信息有用。
    猜你喜欢
    • 2012-08-31
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多