TIFF形式:その1



 レポートやら何やらで忙しかった期間も終わり、一息つけるこの時期。何をするかと言えば、この前やってた画像表示プログラムの開発を再開しようか。



 ・・・と、思ったのですが、壁にぶち当たりました。
 原因はTIFF形式ですよ。
 先方が求めているスペックがハッキリしたのは良いんですが、なんと対象がマルチページTIFF形式のデータなんですね。TIFFなんてMacでしか見たこと無いですよ。・・・と思ったら、昔のPC世界ではかなり普及した画像形式だったらしく、それなりにバージョンが多岐・複雑化してますね。
 どうも、基本的に無圧縮な形式だったのが災いして、ナローバンド時代のWebでは嫌われていたらしいです。だからその時代に生まれた(というか成熟した)OSをそのまま引き継いでいる今のPC・Web世界ではほとんど絶滅してるんですね。WindowsXPでもマルチページ形式TIFFは閲覧できませんでした。
 で、調べてみると、実はJavaでもTIFF形式を扱えるようです。
 じゃまず、「tiff Java」でググります。

JAIを利用するとTIFFファイルでも表示されました

 ほう。しかしこの文脈からするとTIFFTIFFでもマルチページじゃないTIFFのようだな・・・。

 しかし色々な方法が存在するんだなぁ。
 で、インストール法と使い方は・・・?
「JAI ImageIO Tools インストール」でググると・・・

JAI 自体は 2 次元処理を行うためのライブラリだ。これを Image I/O から使うためには Java Advanced Imaging-Image I/O Tools を使用する。今のところ 1.1 は α なので、1.0_01 か 1.0 をダウンロードしよう。Tools には JAI が含まれているので JAI 本体を別途ダウンロードする必要はない。
* http://java.sun.com/products/java-media/jai/current.html

1.0_01 を選択した場合は 4 種類のインストーラーから選ぶことが出来る。
【以下略】

 なるほど。
 という訳で、複雑なことは後々の面倒の元なのでインストーラーさんに任せよう。はい、インストール!


 で、NetBeansでフレームクラスを新規作成し、GUI経由でLabelを貼り付け、そのプロパティのiconの項目から「外部イメージ」選択し、マルチページTIFFを選択。そしてこのクラスを実行すると・・・

うーむ、真っ黒だなぁ。

こんな風に表示して欲しかったんだが。(この画像はマルチページTIFFファイルを生成する(先方の持っている)プログラムから一枚目の画像を単独でbmp形式に変換・保存したものを持ってきた。)
 まあ、想定の範囲内だがな。だってそうだろう?マルチページなんだからその内の何ページ目を表示するのか指定する方法が必要なはずなのに

Java Media APIsのページの

Java Image I/O

The Java Image I/O API provides a pluggable architecture for working with images stored in files and accessed across the network. The JAI Image I/O Tools classes provide additional plugins for other stream types and for advanced formats such as JPEG-LS, JPEG2000, and TIFF.

から

Documentation

The API documentation can be browsed from the following links:

Final releases:

- 1.0_01
- 1.1

と辿ると、プラグインの全てのクラスを見ることが出来るのだが、
public class TIFFImageReadParamを見ると

  • default,
  • BaselineTIFFTagSet,
  • FaxTIFFTagSet,
  • EXIFParentTIFFTagSet,
  • GeoTIFFTagSet

には対応しているようだが、マルチページTIFFの記述が見当たらない。(対応している形式がどんなものかよく分からないのが気になるが。)
また、TIFF関連のクラスを見ても、マルチページファイルの内の何ページ目を表示するか指定するメソッドが見当たらない。或いは自動で、もしくは一ページ目くらいは表示してくれるかと思ったが、駄目だった・・・。
なお、Windowsのペイントで、jpgからTiffに変換した単独画像はちゃんとJavaで表示できた。(もっともこれはもともとwindowsでも表示できるのだが。)Tiff画像を表示するプラグインはちゃんと機能しているようだ。


う〜ん。と言うことは、マルチページTIFFのデータ構造を解析してTIFF用ブラウザを自前で作らないといけないのか?と思ったら、
クラス ImageWriter
public void prepareWriteSequence(IIOMetadata streamMetadata)
において

次に続く一連の writeToSequence 呼び出しを受け付けるために、提供されるストリームメタデータオブジェクトを使用して、ストリームを準備します。メタデータがイメージデータに先行する必要がある場合、このメタデータはストリームに書き込まれます。引数が null の場合、デフォルトストリームメタデータが使用されます。

出力が ImageOutputStream の場合、現在のシーク位置以前の既存の出力内容はフラッシュされ、読み込み可能または書き込み可能である必要はありません。その形式において、1 つの TIFF ファイル内の一連のイメージのように、ヘッダー情報を補修するために endWriteSequence が巻き戻しできることを要求される場合、このメソッドで書き込まれるメタデータは、ストリームの書き込み可能部分に存在する必要があります。他の形式は、このメソッドと各イメージのあとで、ストリームをフラッシュできます。

と、書かれているのを発見した。相変わらず何を言ってるのかよく分からないが、マルチページTIFFを扱う方法がありそうな雰囲気だ。次はこのあたりをキーワードに検索すれば解決するかも知れない、というところで、本日は終わる。