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

使用Java在JPEG中存储DPI和纸张大小信息,java,jpeg,dpi,javax.imageio,Java,Jpeg,Dpi,Javax.imageio,我有以下代码: ImageIO.write(originalImage, OUTPUT_TYPE, resultOutput); 这是对以下javax.imageio.imageio方法的调用: public static boolean write(RenderedImage im, String formatName, File output)

我有以下代码:

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和纸张大小信息来帮助打印操作?

< P>您可以考虑使用Cason SalelSon,而不是ImageIO来执行这个任务。 有关更多信息,请参阅。

我找到了这个。它指出您应该使用“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属性。

是的,这似乎是一个很好的解决方案,能够写:这在sanselan中不起作用:将BMP转换为JPG。可能它只对修改/添加exif类型信息有用。纸张大小使用dpi和像素尺寸自动计算。不需要在元数据中设置它。在PhotoShop和一些打印机客户端上进行了验证。