如何获取图像的dpi(Java)

guh*_*hai 5 java image dpi

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

但在java中,如何获得它?

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

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

br2*_*000 6

您可以使用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();
Run Code Online (Sandbox Code Playgroud)


Til*_*err 5

借助 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: -");
Run Code Online (Sandbox Code Playgroud)

(来源/灵感:大卫·蒂伦

请注意,只有在 dpi 存在时,您才会获得 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);
Run Code Online (Sandbox Code Playgroud)


Ada*_*luk 0

获取您的 ImageReader 实例。然后使用第一个 ImageReader,设置输入并读取 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();
Run Code Online (Sandbox Code Playgroud)

// ... 计算每厘米的点数换算为 dpi : dpi = dpc / 2.54

整个图像中性元数据格式位于