加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 02:01:50 所属栏目:Java 来源:网络整理
导读:我有以下代码: ImageIO.write(originalImage,OUTPUT_TYPE,resultOutput); 这是对以下javax.imageio.ImageIO方法的调用: public static boolean write(RenderedImage im,String formatName,File output) throws IOException 这会将原始BMP图像转换为JGP输出
我有以下代码:

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

解决方法

幸运的是,java image I/O API让你做到了这一点.它还允许以与格式无关的方式设置图像元数据.例如,指定所需的DPI,这是我想要做的.

事实证明,设置dpi并不像预期那么简单……

java image I/O API是plug-in based,对于您希望使用的每种文件格式,必须提供适当的插件. API为编写插件中性代码提供了必要的abstractions,并且具有可在运行时查询的可用实现的存储库.从J2SE 6开始,每个JRE都必须提供PNG,JPG和BMP文件格式的插件(以及我尚未尝试过的其他一些插件).

设置图像元数据的规范是standard (plug-in neutral)元数据格式规范.奇怪的是,规范是XML模式.这是正确的,如果你想设置DPI,你将不得不通过使用IIOMetadataNodes和merge it构建一个DOM树来完成它!叹..

请注意,插件对标准元数据的支持可能不同:

>有些人不是support changing the standard metadata
>有些人不是support the standard metadata format at all
>有些人不支持merging your DOM-tree with the current metadata
并将默默地取代它

无论如何,当您想要设置DPI时,相关标签是Horizo??ntalPixelSize和VerticalPixelSize:

<!ELEMENT "HorizontalPixelSize" EMPTY>
   <!-- The width of a pixel,in millimeters,as it should be rendered on media -->
   <!ATTLIST "HorizontalPixelSize" "value" #CDATA #REQUIRED>
   <!-- Data type: Float -->
<!ELEMENT "VerticalPixelSize" EMPTY>
   <!-- The height of a pixel,as it should be rendered on media -->
   <!ATTLIST "VerticalPixelSize" "value" #CDATA #REQUIRED>
   <!-- Data type: Float -->

请注意,规范明确指出两者都必须以毫米每点表示.
如何忽视自己的规格,Sun风格

Sun已为其PNG和JPG插件实现了此元数据规范,并将其包含在当前的JDK和JRE发行版中.相关课程是

com.sun.imageio.plugins.png.PNGImageWriter
com.sun.imageio.plugins.jpeg.JPEGImageWriter

您可以从com.sun包中看出它们不是J2SE API的一部分,而是特定于Sun的实现.

还记得每个点的规格要求毫米吗?那么,看看下表,看看Sun实际上如何实现规范:

plug-in          unit                 bug report   date reported
PNGImageWriter   dots per millimeter  bug 5106305  23 sep 2004
JPEGImageWriter  decimeter per dot    bug 6359243  05 dec 2005

这些错误已经知道了很长时间,并且它们的修复非常简单.不幸的是,它们被赋予了低优先级,在撰写本文时(2008年7月)甚至没有被评估过.
大.怎么办?

好吧,因为解决方法是如此微不足道,我决定坚持使用图像I / O API.如果你给这些类他们想要的东西,位图就会很好.要确保您的导出代码也适用于正确实现规范的平台,它必须检查正在使用的实际实现类并补偿错误.

如果您发现自己处于类似情况,请确保您的解决方法代码能够在最终修复错误时应对.更多关于这篇文章’How bugs in the J2SE api can bite you twice‘.

哦,如果你使用instanceof来检查所有平台上不能保证存在的错误类的实例,请务必捕获NoClassDefFoundError;)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读