JavaでマルチTIFFファイルを読み込み・表示する
JavaでマルチTIFFファイルを扱う方法を解説。標準JDKでは非対応のマルチページTIFFを、JDeliライブラリを使って読み込み、ページ送りで表示する実装例を紹介します。

TIFF(Tagged Image File Format)は、複数の画像を1つのファイルにまとめて格納できる画像フォーマットです。この複数ページを持つTIFFファイルは「マルチTIFF」や「マルチページTIFF」と呼ばれ、FAXデータの保存、スキャンした書類のアーカイブ、医療画像の管理など、さまざまな業務用途で広く利用されています。この記事では、Javaでマルチ TIFFファイルを読み込み、ページ送りで表示するビューアを実装する方法を解説します。
マルチTIFFとは
通常の画像ファイル(JPEGやPNGなど)は1ファイルにつき1枚の画像を格納しますが、TIFF形式は複数の画像(ページ)を1つのファイル内に連続して保持できる構造を持っています。
マルチTIFFが使われる代表的なシーンは以下の通りです。
- FAX文書の電子保存: 複数ページのFAX送受信データを1ファイルで管理
- ドキュメントスキャン: スキャナーで取り込んだ複数ページの書類を1ファイルにまとめて保存
- 医療画像(DICOM関連): 検査結果の連続画像を1ファイルに格納
- 図面管理: 複数枚の設計図面を1つのTIFFファイルにまとめて配布
業務システムでは、こうしたマルチTIFFファイルをJavaアプリケーション上で表示・処理する要件がしばしば発生します。
標準JDKの制約とJDeliの活用
JavaのImageIOフレームワークにはTIFFのリーダーが含まれていますが、マルチページTIFFの各ページを個別に読み込む機能は十分ではありません。BufferedImageは1枚の画像しか保持できないため、マルチTIFF内の複数ページを順番に読み出すには追加のライブラリが必要です。
JDeli(ジェイデリ)はマルチTIFFに完全対応しており、ファイル内の画像数の取得と、任意のページの読み込みをシンプルなAPIで実現できます。
マルチTIFFの読み込み
JDeliのTiffDecoderクラスを使えば、マルチTIFFファイル内の画像数を取得し、指定したインデックスの画像をBufferedImageとして読み込むことができます。
final TiffDecoder tiff = new TiffDecoder();
// ファイル内の画像数を取得
final int imageCount = tiff.getImageCount(file);
// 指定インデックスの画像を読み込み(0始まり)
BufferedImage image = tiff.readImageAt(0, file);getImageCount()メソッドでファイル内のページ数を事前に把握し、readImageAt()メソッドで任意のページにアクセスします。インデックスは0始まりで、最初のページが0、2ページ目が1となります。
ページ送り機能付きビューアの実装
マルチTIFFの各ページを順番に閲覧するには、「前へ」「次へ」のボタンでページを切り替えるビューアを実装するのが一般的です。以下に、Swingを使った基本的な実装例を示します。
画像数の取得とデコーダーの準備
final TiffDecoder tiff = new TiffDecoder();
final int imageCount = tiff.getImageCount(file);ページ送りボタンの実装
int currentIm = 0;
final JButton next = new JButton("Next image");
final JButton prev = new JButton("Previous image");
next.addActionListener(a -> {
if (currentIm < imageCount - 1) {
currentIm++;
drawImage();
}
});
prev.addActionListener(a -> {
if (currentIm > 0) {
currentIm--;
drawImage();
}
});
// ボタンをパネルに追加
final JPanel multiButtons = new JPanel();
multiButtons.add(prev);
multiButtons.add(next);
add(multiButtons, BorderLayout.PAGE_END);「Next image」ボタンはインデックスが最大値に達したら無効化し、「Previous image」ボタンはインデックスが0のとき無効化することで、範囲外アクセスを防止しています。
画像描画メソッド
void drawImage() {
BufferedImage image = tiff.readImageAt(currentIm, file);
imageLabel.setIcon(new ImageIcon(image));
}drawImage()メソッドは、現在のインデックスに対応する画像をTIFFファイルから読み込み、JLabelのアイコンとして設定します。ページを切り替えるたびにこのメソッドが呼ばれ、表示が更新されます。
実装のポイントと応用
メモリ管理
マルチTIFFファイルに含まれる画像が高解像度の場合、すべてのページを一度にメモリに読み込むとOutOfMemoryErrorが発生する可能性があります。上記の実装例のように、表示中のページだけを読み込む「オンデマンド読み込み」方式を採用することで、メモリ使用量を抑えることができます。
サーバーサイドでの活用
ビューアとしての表示だけでなく、サーバーサイドでマルチTIFFの各ページをJPEGやPNGに変換してWeb配信するといった用途にもJDeliは活用できます。JDeliの書き出し機能と組み合わせれば、TIFF内の各ページを個別の画像ファイルとしてエクスポートすることも容易です。
// マルチTIFFの各ページをPNGに変換
for (int i = 0; i < imageCount; i++) {
BufferedImage page = tiff.readImageAt(i, file);
JDeli.write(page, "png", new File("page_" + i + ".png"));
}まとめ
JavaでマルチTIFFファイルを扱うには、標準JDKの制約を補うライブラリが必要です。JDeliを使えば、マルチTIFF内のページ数取得と個別ページの読み込みをシンプルなAPIで実装できます。ビューアとしてのページ送り表示はもちろん、サーバーサイドでの画像変換やバッチ処理にも応用可能です。JDeliは無料トライアル版が提供されていますので、実際のマルチTIFFファイルを使って動作を確認してみてください。

開発者向けPDF入門ガイド
PDFの仕様や活用方法など、開発者に必要な情報をコンパクトにまとめました。初めてPDFを扱う開発者にも分かりやすく、基礎から応用までカバーしているため、PDFのポテンシャルを最大限に引き出し、アプリケーション開発やドキュメント管理の効率化を図るための手引きとなるでしょう。