用Java在JPEG中存储DPI和纸张大小信息



我有以下代码:

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和纸张尺寸信息以帮助打印操作?

我找到了这篇关于在PNG文件上设置DPI的文章。它指出你应该使用"元数据"。

考虑到这一点,下面是一些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属性

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

最新更新