How to get the dpi of an image(Java)

后端 未结 7 1949
无人及你
无人及你 2021-01-06 01:51

In c#, we can use Image.HorizontalResolution and Image.VerticalResolution.

But in java, how to get it?

I found ImageInfo.java, but it only supp

7条回答
  •  遥遥无期
    2021-01-06 02:13

    With the help of an ImageReader instance, you can get the image meta data in a neutral format, and then parse it for what you need. A DTD is here.

        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: -");
    

    (Source/Inspiration: David Thielen)

    Note that you will get a dpi only if it is there.

    If you wonder what's in the Metadata XML, use this code:

        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);
    

提交回复
热议问题