37835
Javaで画像の実サイズを取得したいです．

対象の画像形式はTIFF, JPEG, PNG, GIFです．本家stackoverflowにImageIOを使っている例があるのですが、

(例）  
<https://stackoverflow.com/questions/672916/how-to-get-image-height-and-width-
using-java>

どうもこれはあくまでピクセル数の取得で、解像度は取得していないように見えます．解像度がないと画像の実サイズが計算できませんので困ります．

適切な方法、ライブラリがありましたら教示ください．

※ GIFは解像度がないのでプログラム既定の解像度を用いて呼び出し側で適切に計算するつもりです．
CC BY-SA 3.0
2017-09-09T15:37:12.100
37834
2017-09-18T17:26:27.370
9503
question
java 画像
Javaで画像サイズを取得する
* JPEGの場合は以下のようにメタデータから解像度を取得できます
  * PNGも同様の方法で解像度を取得できそうです 
    * 参考: [javax.imageio.metadata (Java Platform SE 8 )](https://docs.oracle.com/javase/jp/8/docs/api/javax/imageio/metadata/package-summary.html)
    * 追記: [java - How to set DPI information in an image? - Stack Overflow](https://stackoverflow.com/questions/321736/how-to-set-dpi-information-in-an-image)
  * TIFFは標準では ~~多分~~ 現状未対応です 
    * 追記: `Java 9`では標準になりそう？ [Java 9のTIFF入出力機能を試してみた | HOS Co.,Ltd.](http://www.hos.co.jp/blog/20161025/)
    * 追記: [Java Advanced Imaging API Home Page](http://www.oracle.com/technetwork/jp/java/javase/documentation/iio-141084.html)

```

    import java.io.*;
    import java.net.*;
    import java.nio.file.*;
    import java.util.Iterator;
    import javax.imageio.*;
    import javax.imageio.metadata.*;
    import javax.imageio.stream.*;
    import org.w3c.dom.*;
    
    public class JpegDpiTest {
      public static void main(String[] args) {
        Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("jpeg");
        ImageReader reader = readers.next();
        URL url = JpegDpiTest.class.getResource("test.jpg");
        try (InputStream is = Files.newInputStream(Paths.get(url.toURI()));
             ImageInputStream iis = ImageIO.createImageInputStream(is)) {
            reader.setInput(iis, true);
            System.out.format("Width: %d%n", reader.getWidth(0));
            System.out.format("Height: %d%n", reader.getHeight(0));
    
            IIOMetadata meta = reader.getImageMetadata(0);
            IIOMetadataNode root = (IIOMetadataNode) meta.getAsTree("javax_imageio_jpeg_image_1.0");
    
            Element jfif = (Element) root.getElementsByTagName("app0JFIF").item(0);
            System.out.format("Xdensity: %s%n", jfif.getAttribute("Xdensity"));
            System.out.format("Ydensity: %s%n", jfif.getAttribute("Ydensity"));
        } catch (IOException | URISyntaxException ex) {
            ex.printStackTrace();
        }
      }
    }
    
```
CC BY-SA 3.0
2017-09-09T17:13:39.307
37835
2017-09-18T17:26:27.370
2017-09-18T17:26:27.370
46
46
37834
answer