如何获取图像的dpi(Java)

在c#中,我们可以使用Image.Horizo​​ntalResolution和Image.VerticalResolution。

但在java中,如何获得它?

我找到了ImageInfo.java ,但它只支持一些图像类型。

http://kickjava.com/src/imageinfo/ImageInfo.java.htm

您可以使用Apache Commons Sanselan库来获取图像信息: http ://commons.apache.org/imaging/index.html。

 final ImageInfo imageInfo = Sanselan.getImageInfo(file_); final int physicalWidthDpi = imageInfo.getPhysicalWidthDpi(); final int physicalHeightDpi = imageInfo.getPhysicalHeightDpi(); 

借助ImageReader实例,您可以以中性格式获取图像元数据,然后根据需要对其进行解析。 DTD就在这里 。

  ImageInputStream iis = ImageIO.createImageInputStream(new File(path)); Iterator it = ImageIO.getImageReaders(iis); if (!it.hasNext()) { System.err.println("No reader for this format"); return; } ImageReader reader = (ImageReader) it.next(); reader.setInput(iis); IIOMetadata meta = reader.getImageMetadata(0); IIOMetadataNode root = (IIOMetadataNode) meta.getAsTree("javax_imageio_1.0"); NodeList nodes = root.getElementsByTagName("HorizontalPixelSize"); if (nodes.getLength() > 0) { IIOMetadataNode dpcWidth = (IIOMetadataNode) nodes.item(0); NamedNodeMap nnm = dpcWidth.getAttributes(); Node item = nnm.item(0); int xDPI = Math.round(25.4f / Float.parseFloat(item.getNodeValue())); System.out.println("xDPI: " + xDPI); } else System.out.println("xDPI: -"); if (nodes.getLength() > 0) { nodes = root.getElementsByTagName("VerticalPixelSize"); IIOMetadataNode dpcHeight = (IIOMetadataNode) nodes.item(0); NamedNodeMap nnm = dpcHeight.getAttributes(); Node item = nnm.item(0); int yDPI = Math.round(25.4f / Float.parseFloat(item.getNodeValue())); System.out.println("yDPI: " + yDPI); } else System.out.println("yDPI: -"); 

(来源/灵感: David Thielen )

请注意,只有在存在时才会获得dpi。

如果您想知道元数据XML中的内容,请使用以下代码:

  StringWriter xmlStringWriter = new StringWriter(); StreamResult streamResult = new StreamResult(xmlStringWriter); Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // http://stackoverflow.com/a/1264872/535646 transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2"); DOMSource domSource = new DOMSource(root); transformer.transform(domSource, streamResult); System.out.println (xmlStringWriter); 

获取ImageReader实例。 然后使用第一个ImageReader,设置Input并读取IIOImage或仅设置getImageMetadata(pageIndex)。 您将获得图像格式中性元数据xml并解析它以获取所需数据。

 ImageInputStream iis = ImageIO.createImageInputStream(in); Iterator it = ImageIO.getImageReaders(iis); if (!it.hasNext()) { System.outprintln("No reader for this format"); } ImageReader reader = (ImageReader) it.next(); reader.setInput(iis); IIOMetadata meta = reader.getImageMetadata(0); IIOMetadataNode dimNode = meta.getStandardDimensionNode(); NodeList nodes = dimNode.getElementsByTagName("HorizontalPixelSize"); IIOMetadataNode dpcWidth = (IIOMetadataNode)nodes.nextElement(); nodes = dimNode.getElementsByTagName("VerticalPixelSize"); IIOMetadataNode dpcHeight = (IIOMetadataNode)nodes.nextElement(); 

// …每厘米计算点数到dpi:dpi = dpc / 2.54

整个图像中性元数据格式在

ImageMagick是所有图像相关工作的强大工具。 IM需要安装并需要对环境进行一些配置,但这是值得的。

http://www.imagemagick.org

我建议你使用JMagick机智IM:

http://www.jmagick.org

我不会解释有关如何的细节因为它是在给出的url中记录的。

我觉得这个例子很有趣:

 ByteArrayInputStream bis = new ByteArrayInputStream(uploadedFile.getContents()); Iterator readers = ImageIO.getImageReadersByFormatName("jpg"); ImageReader reader = (ImageReader) readers.next(); IIOMetadata meta = reader.getImageMetadata(0); Element tree = (Element) meta.getAsTree("javax_imageio_jpeg_image_1.0"); Element jfif = (Element)tree.getElementsByTagName("app0JFIF").item(0); int dpiH = Integer.parseInt( jfif.getAttribute("Xdensity") ); int dpiV = Integer.parseInt( jfif.getAttribute("Ydensity") ); /* now test that (dpiH == dpiV) */ /* imports are: import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.metadata.IIOMetadata; import javax.imageio.stream.ImageInputStream; import org.primefaces.model.UploadedFile; import org.w3c.dom.Element; */