Sanselanを使ってTIFFを読み込む
JavaでTIFF画像を読み込む必要が有ったので調べてみた。ImageIO辺りで既に対応済みかと思いつつ、念のため対応フォーマットをチェックしてみる。
public void doPrintImageFormat(){ String[] formatNames = ImageIO.getReaderFormatNames(); System.out.println("ReaderFormatNames:"); for(String s:formatNames) { System.out.print(s+", "); } }
結果は下記の通り。残念ながらJava SE6でも未対応らしい。
ReaderFormatNames:
BMP, bmp, jpg, JPG, jpeg, wbmp, png, JPEG, PNG, WBMP, GIF, gif,
JAI (Java Advanced Imaging) を使っても良いのだけど、各動作環境でライブラリをインストールしなければならないのは面倒だし、ここまで高機能なものは要らない。jarファイル一つだけで簡単に使えるモノはないかと探してみたら、Sanselanを見つけた。画像サイズを取得するサンプルコードは下記の通り。
import java.io.File; import java.io.IOException; import org.apache.sanselan.ImageFormat; import org.apache.sanselan.ImageReadException; import org.apache.sanselan.Sanselan; import org.apache.sanselan.ImageInfo; public class Main { public static void main(String[] args) throws ImageReadException, IOException { doPrintImageSize("sample.jpg"); doPrintImageSize("sample.tiff"); doPrintImageSize("sample.psd"); } public static void doPrintImageSize(String filename) throws ImageReadException, IOException{ long t1 = System.currentTimeMillis(); File srcFile = new File(filename); ImageInfo info = Sanselan.getImageInfo(srcFile); long t2 = System.currentTimeMillis(); System.out.println("- "+srcFile.getAbsolutePath()+", Width:"+info.getWidth()+", Height:"+info.getHeight()+", Time:"+(t2-t1)); } }
実行結果は下記の通り。JPEG, TIFF, PSDなどの画像サイズをメタデータから取得しており、なかなか良い感じ。
- /Users/hoge/Console/sample.jpg, Width:1600, Height:1200, Time:228 - /Users/hoge/Console/sample.tiff, Width:1600, Height:1200, Time:6 - /Users/hoge/Console/sample.psd, Width:1600, Height:1200, Time:2
画像データの読み込みも簡単。(呼び出し先はこちらのコードを参照)
BufferedImage image = ImageReadExample.imageReadExample(new File("sample.tiff"));
あとは通常の画像データと同様に扱える。同様にJPEG画像のExifデータ取得も簡単。(呼び出し先はこちらを参照)
MetadataExample.metadataExample(new File("sample.jpg"));
この結果は下記の通り。
file: sample.jpg XResolution: 180 Date Time: '2000:06:11 23:02:49' Date Time Original: '2000:06:11 23:02:49' Create Date: '2000:06:11 23:02:49' ISO: Not Found. Shutter Speed Value: 256042/65536 (3.907) Aperture Value: 194698/65536 (2.971) Brightness Value: Not Found. GPS Latitude Ref: 'R98' GPS Latitude: 48, 49, 48, 48 GPS Longitude Ref: Not Found. GPS Longitude: Not Found. item: Make: 'Canon' item: Model: 'Canon IXY DIGITAL' item: Orientation: 1 item: XResolution: 180 item: YResolution: 180 item: Resolution Unit: 2 item: Modify Date: '2000:06:11 23:02:49' item: YCbCr Positioning: 1 item: Exif Offset: 184 item: Exposure Time: 1/15 (0.067) item: FNumber: 28/10 (2.8) item: Exif Version: 48, 50, 49, 48 item: Date Time Original: '2000:06:11 23:02:49' item: Create Date: '2000:06:11 23:02:49' item: Components Configuration: 1, 2, 3, 0 item: Compressed Bits Per Pixel: 3 item: Shutter Speed Value: 256042/65536 (3.907) item: Aperture Value: 194698/65536 (2.971) item: Exposure Compensation: 0 item: Max Aperture Value: 194698/65536 (2.971) item: Subject Distance: 2615/1000 (2.615) item: Metering Mode: 2 item: Flash: 0 item: Focal Length: 173/32 (5.406) item: Maker Note: 10, 0, 1, 0, 3, 0, 19, 0, 0, 0, 120, 3, 0, 0, 2, 0, 3, 0, 4, 0, 0, 0, -98, 3, 0, 0, 3, 0, 3, 0, 4, 0, 0, 0, -90, 3, 0, 0, 4, 0, 3, 0, 15, 0, 0, 0, -82, 3, 0, 0, 0... (310) item: UserComment: '' item: Flashpix Version: 48, 49, 48, 48 item: Color Space: 1 item: Exif Image Width: 1600 item: Exif Image Length: 1200 item: Interop Offset: 1088 item: Focal Plane XResolution: 1600000/206 (7,766.99) item: Focal Plane YResolution: 1200000/155 (7,741.935) item: Focal Plane Resolution Unit: 2 item: Sensing Method: 2 item: File Source: 3 item: Interop Index: 'R98' item: Interop Version: 48, 49, 48, 48 item: Related Image Width: 1600 item: Related Image Length: 1200 item: Compression: 6 item: XResolution: 180 item: YResolution: 180 item: Resolution Unit: 2 item: Jpg From Raw Start: 1524 item: Jpg From Raw Length: 4542
Jarファイル一つを含めれば良いだけなので、これは便利に使えそうですね。