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

标签 java jpeg dpi javax.imageio

我有以下代码:

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/

相关文章:

java - 检查网络位置提供程序是否启用的任何替代方法?

Java:Object.wait() 导致执行的主线程从测试返回

java - 以编程方式减小 JPEG 文件大小

java - 从 JAVA 启动 MATLAB 代码时出现问题

c# - WPF ClickOnce DPI 感知 Per-Monitor v2

c# - 从位图转换为 JPEG 并保留原始位图分辨率

java - 如何使用 Java 代码阅读 MS Outlook 收件箱邮件?

Java:将私有(private)成员字段设置为可访问的危险?

c# - 将位图编码为 Jpeg

windows - 所有 Windows PC 显示器上的每英寸像素数都是标准的吗? (LogPixelsX) 在 GetDeviceCaps WinAPI 调用中