JavaでHEICをJPGに変換 -- PNG・WebP対応の画像ライブラリーJDeli
JavaでHEICからJPGやPNGへの変換をコード1行で実現するJDeliを紹介。14種類の画像フォーマットに対応し、ImageIO互換のAPIで手軽に導入できます。

iPhoneで撮影された写真のほとんどがHEICフォーマットで保存されている現在、業務アプリケーションやWebサービスの開発でHEIC対応は避けて通れない課題です。この記事では、JavaでHEICをJPGやPNGに変換する方法を、画像処理ライブラリーJDeli(ジェイデリ)のサンプルコードとともに解説します。
iPhone写真のHEICは無視できない
業務アプリやユーザー投稿型のWebサービスを開発する際、エンドユーザーのスマートフォンから写真を送信してもらう処理フローでは、HEIC形式への対応が不可欠です。日本のスマートフォン市場ではiPhoneのシェアが約6割を占めており、近年のiPhoneはデフォルト設定でHEIC形式を使って写真を保存します。
つまり、ユーザーがアップロードする写真の多くがHEIC形式であることを前提にシステムを設計する必要があります。HEIC非対応のままサービスをリリースすると、「写真がアップロードできない」「画像が表示されない」といったクレームに直結します。
HEICとは何か
HEIC(High Efficiency Image Container、ヘイク)は、Apple社が2017年からmacOS、iOS、iPadOSで採用している画像フォーマットです。HEIF(High Efficiency Image File Format)の一種で、動画圧縮技術であるHEVC(H.265)を静止画に応用した高効率な画像圧縮を特徴としています。
HEICがJPEGと比較して優れている点は多くあります。
- 高い圧縮効率: 同等画質のJPEGと比べて約半分のファイルサイズに圧縮可能
- 16ビットカラー対応: JPEGの8ビットを超える色深度で、より豊かな色表現が可能
- 複数画像の格納: 1つのHEICファイルに複数の画像をまとめて保存できる
- 非破壊編集のサポート: 元画像と編集履歴情報をセットで保存し、編集のやり直しが可能
- 透過画像のサポート: PNGのようにアルファチャンネル(透過情報)を持てる
一方で、HEICはWindows環境やWebブラウザでの標準サポートが限定的であり、サーバーサイドで他のフォーマットへの変換処理が求められるケースが大半です。
JDeliならHEICの読み書き・変換が簡単
Java画像処理ライブラリーのJDeliは、同種ツールの中でも早い段階からHEICの読み書きと変換に対応しています。Java標準のImageIOとほぼ互換のAPI設計なので、ImageIOに慣れている開発者であればスムーズにコードを書き始められます。
HEICを読み込む
JDeli.read() メソッドにHEICファイルを渡すだけで、BufferedImageオブジェクトとして読み込めます。
// ファイルから読み込み
BufferedImage image = JDeli.read(heicImageFile);デコーダーを直接使用する方法もあります。
// HeicDecoderを使った読み込み
HeicDecoder decoder = new HeicDecoder();
BufferedImage image = decoder.read(heicData);HEICを書き出す
逆に、BufferedImageをHEIC形式で書き出すことも可能です。
// HEIC形式で書き出し
JDeli.write(myBufferedImage, "heic", outputStreamOrFile);バイト配列として取得する場合は以下のように記述します。
byte[] outputData = JDeli.write(myBufferedImage, "heic");エンコードオプション付きでHEICを書き出す
圧縮品質などの詳細設定を行いたい場合は、HeicEncoderOptionsを使用します。
final HeicEncoderOptions options = new HeicEncoderOptions();
JDeli.write(myBufferedImage, options, outputStreamOrFile);HEICから他フォーマットへの直接変換
実務で最も多い処理パターンは、HEICをJPEGやPNGに変換するケースです。JDeliのconvert()メソッドを使えば、BufferedImageへの読み込みと再書き出しという中間ステップを省いて、コード1行で直接変換できます。メモリ効率にも優れ、大量の画像を処理するバッチ処理にも適しています。
HEICをPNG/JPGに変換する4つのパターン
ファイル間の変換
出力ファイルの拡張子からフォーマットを自動判定します。
JDeli.convert(File inFile, File outFile);ストリームでの変換
出力フォーマットを文字列で明示的に指定します。
JDeli.convert(InputStream inFile, OutputStream outFile, String format);バイト配列での変換
メモリ上のデータを直接変換し、結果をバイト配列で受け取ります。
byte[] outputData = JDeli.convert(byte[] inputData, String format);エンコードオプション付きの変換
出力品質やサイズなどを細かく指定する場合に使用します。
JDeli.convert(File inFile, EncoderOptions outputOptions, File outFile);JDeliは14種類の画像フォーマットを幅広くカバー
JDeliはHEICだけでなく、WebP、DICOM、TIFF(マルチページ対応)、JPEG2000など、合計14種類の画像フォーマットの読み込みに対応しています。出力は9種類に対応しており、入力と出力の任意の組み合わせでフォーマット変換が可能です。
バッファへの読み込みや中間フォーマットの経由が不要なため、メモリの確保・解放に起因するトラブルとも無縁です。ImageIOよりも高性能・高効率に動作するため、ImageIOからJDeliへの移行も有力な選択肢です。
マルチページTIFFにも対応しているので、図面管理アプリやFAXシステムといった業務システムの開発にも活用できます。
まとめ
iPhoneのHEIC写真への対応は、現在のJavaアプリケーション開発において避けて通れない要件です。JDeliを使えば、HEICからJPGやPNGへの変換はもちろん、14種類の画像フォーマットを自在に扱える環境が手に入ります。ImageIOとほぼ互換のAPIで導入のハードルが低いのも大きな魅力です。
JDeliは無料で試用していただけます。画像フォーマット変換の機能や処理速度を、まずはご自身の環境でお試しください。

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