用Java在JPEG中存储DPI和纸张尺寸信息

5

我有以下代码:

ImageIO.write(originalImage, OUTPUT_TYPE, resultOutput);

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

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

这将把原始的BMP图像转换为JPG输出。是否可以在JPEG中还存储DPI和纸张尺寸信息,以帮助打印操作?
2个回答

4
我发现了这篇设置PNG文件DPI的文章。它指出你应该使用'metadata.mergeTree'来正确保存元数据。
有了这个想法,下面是一些有效的Groovy代码,可以将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的预览应用程序和Gimp中都可以正常工作,两者都报告生成的图像为100 DPI。至于纸张大小...我想这是直接由DPI确定的?我找不到任何可以设置该特定值的JPEG属性。

1
纸张大小是使用dpi和像素尺寸自动计算的,无需在元数据中设置。在PhotoShop和一些打印机客户端上进行了验证。 - Niket Kumar

3

是的,这似乎是一个不错的解决方案,可以编写:http://www.screaming-penguin.com/node/7485 - Joop Eggen
在sanselan中无法实现此功能:将BMP转换为JPG。也许它只适用于修改/添加exif类型信息。 - dsummersl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接