【问题标题】:How to get the dpi of an image(Java)如何获取图像的dpi(Java)
【发布时间】:2011-10-31 20:05:05
【问题描述】:

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

但是在java中,如何获取呢?

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

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

【问题讨论】:

  • 您正在使用哪些图像类型?
  • 我需要能够支持所有图像类型的解决方案。

标签: java image dpi


【解决方案1】:

您可以使用 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();

【讨论】:

    【解决方案2】:

    借助 ImageReader 实例,您可以获取中性格式的图像元数据,然后根据需要对其进行解析。 DTD 是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: -");
    

    (来源/灵感: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);
    

    【讨论】:

      【解决方案3】:

      它对我有用。

       try {
      
              final ImageInfo imageInfo = Sanselan.getImageInfo(new File("C:/Users/AngryMan/Desktop/abc.png"));
              final int physicalWidthDpi = imageInfo.getPhysicalWidthDpi();
              final int physicalHeightDpi = imageInfo.getPhysicalHeightDpi();
              System.out.println("physicalWidthDpi :"+physicalWidthDpi );
              System.out.println("physicalHeightDpi : "+physicalHeightDpi);
      
          } catch (Exception e) {
              e.printStackTrace();
          }
      

      Maven 依赖

       <!-- https://mvnrepository.com/artifact/org.apache.sanselan/sanselan -->
          <dependency>
              <groupId>org.apache.sanselan</groupId>
              <artifactId>sanselan</artifactId>
              <version>0.97-incubator</version>
          </dependency>
      

      【讨论】:

        【解决方案4】:

        获取您的 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();
        

        // ... 将每厘米点数转换为 dpi : dpi = dpc / 2.54

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

        【讨论】:

        • IIOMetadata 类型的 getStandardDimensionNode() 方法不可见
        • NodeList 类型的 nextElement() 方法未定义
        • 这是来自一个相当老的论坛帖子的代码 - 它不再有效。
        • 我进行了编辑,现在应该可以使用了;或者,查看java-forum.org/java-basics-anfaenger-themen/…
        • @TilmanHausherr 出于某种原因(可能审稿人没有正确阅读)您的编辑已被拒绝。我建议添加一个新答案。
        【解决方案5】:

        查找 .bmp 图像使用的 dpi:

        import com.lowagie.text.Image.
        
            public class BitmapResolution {
                public static void main(String args[]) {
                    try {
                        Image img = Image.getInstance("C:/Users/AngryMan/Desktop/img003.bmp");
                        System.out.println(img.getDpiX());
                        System.out.println(img.getDpiY());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        

        Maven 依赖:

                <!-- https://mvnrepository.com/artifact/com.lowagie/itext -->
                <dependency>
                    <groupId>com.lowagie</groupId>
                    <artifactId>itext</artifactId>
                    <version>2.1.7</version>
                </dependency>     
        

        【讨论】:

          【解决方案6】:

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

          http://www.imagemagick.org

          我建议你使用 JMagick wit IM:

          http://www.jmagick.org

          我不会解释关于如何的详细信息,因为它记录在给定的网址中。

          【讨论】:

          • 所有纯java解决方案绝对不值得麻烦
          【解决方案7】:

          我发现这个例子很有趣:

          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;
          */
          

          【讨论】:

            猜你喜欢
            • 2016-08-18
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-09-17
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多