使用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和纸张尺寸信息以帮助打印操作? 解决方法
幸运的是,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 无论如何,当您想要设置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已为其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;) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |