我有以下代码:
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 和纸张尺寸信息以帮助打印操作?
最佳答案
我找到了这个 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 的预览应用程序中对我来说效果很好,Gimp 都报告生成的图像为 100 DPI。至于纸张大小……我想这是直接由 DPI 决定的吧?我找不到任何可以设置该特定值的 JPEG 属性。
关于java - 使用 Java 在 JPEG 中存储 DPI 和纸张尺寸信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8618778/