100% Pure JavaでJPEG XLをデコードするオープンソースライブラリ「jxl-java」を公開
NTTレゾナントテクノロジー株式会社

~Rust製デコーダーをWebAssembly経由でJavaバイトコード化、一行でJPEG XLの読み込みに対応~
NTTレゾナントテクノロジー株式会社(本社:東京都千代田区大手町、代表取締役社長:三澤 淳志、以下「当社」)は、次世代画像フォーマットJPEG XLをJava標準の画像入出力API(ImageIO)で読み込めるオープンソースライブラリ「jxl-java」をGitHubにて公開しました。Apacheライセンスで提供され、商用・非商用を問わずに無償でご利用いただけます。
GitHub:
https://github.com/nttr-tech/jxl-java
JPEG XL(ISO/IEC 18181)は、高圧縮・高画質に加え、可逆/非可逆圧縮、HDR・広色域、アルファチャンネル、既存JPEGの可逆再圧縮までを1つのフォーマットでカバーする次世代画像フォーマットです。2023年にSafariが正式サポートし、ChromeやFirefoxでも対応が進むなど、採用判断に備えるべきフェーズに入っています。
一方、Java標準ライブラリはJPEG XLに対応しておらず、従来の現実的な選択肢はC++製リファレンス実装(libjxl)をJNI経由で呼び出す方式でした。この方式には次の課題があります。
- OS・CPUアーキテクチャごとにネイティブバイナリを用意・配布する運用負荷- ネイティブコードのクラッシュや脆弱性がJVMプロセス全体に波及するリスク- 外部からアップロードされた画像など、信頼できない入力を扱うサーバー用途での障害範囲の大きさ
「jxl-java」は、この課題を「Rust × WebAssembly × Chicory AOT」という構成で解決します。
(1)100% Pure Java ― JARひとつで全OS・全CPUに配布可能
Google Researchが開発したRust製JPEG XLデコーダー jxl-rs をWebAssemblyにコンパイルし、WebAssemblyランタイム Chicory のAOTコンパイラでビルド時にJavaバイトコード(classファイル)へ事前変換しています。実行時にはネイティブライブラリもJNIも一切使用しません。配布物はJARのみで、OS・CPUアーキテクチャを問わず動作します。
(2)メモリ安全性とサンドボックスによる障害の隔離
デコーダー本体はメモリ安全なRustで書かれ、さらにJVM内のWebAssemblyサンドボックス内で実行されます。不正な入力による異常はJVMプロセスを巻き込まず、Javaの例外として隔離されます。アップロード画像の受け入れなど、信頼できない入力を扱う用途に適した設計です。
(3)導入後のコードは「従来のImageIO」のまま
ImageIOのService Provider Interfaceにより自動登録されるため、初期化コードは不要です。JARをクラスパスに置くだけで、従来のJava読み込みコードでそのままJPEG XLに対応できます。
java
[画像:
https://prcdn.freetls.fastly.net/release_image/141579/19/141579-19-eaa8f6d36b7660f9d7a904a04f4d3ae7-3300x409.png?width=536&quality=85%2C75&format=jpeg&auto=webp&fit=bounds&bg-color=fff ]
(4)実用性へのこだわり
- ピクセル変換の最小化:デコーダーはWebAssembly内で直接、事前乗算済みBGRAを出力。リトルエンディアンのメモリ配置を利用してARGB intへコピー中心で変換し、Java 2Dが最速で合成できる TYPE_INT_ARGB_PRE の BufferedImage を生成します。- カラーマネジメント:広色域やICCプロファイル付き画像は ICC_ColorSpace + ColorConvertOp でsRGBへ変換し、表示結果の一貫性を確保。壊れたプロファイルの場合は変換をスキップしてデコードを継続します。- スレッド安全性:WebAssemblyモジュールの解析はJVMごとに1回。デコードごとに新規WebAssemblyインスタンス(生成はサブミリ秒)を使うため、状態を共有せず安全に並列実行できます。- 2つの配布形態:通常版JARに加え、Chicoryランタイムを内部パッケージへシェーディングした自己完結型fat JARを提供。アプリケーション側の既存の依存関係と衝突しません。
安全性・可搬性を優先する読み込み用途 ― サムネイル生成、アップロード画像の受け入れ、デスクトップ表示、マルチOS配布 ― に適しています。大量バッチ変換や低遅延が最優先の用途や、JPEG XLエンコードには現時点では向きません。
- 実行時:Java 11以降- ビルド時:JDK 21以降 + Rustツールチェーン(wasm32-unknown-unknown ターゲット)
当社は本ライブラリをオープンソースとしてメンテナンスしていく予定でコミュニティからのIssue・Pull Requestを歓迎します。今後はWasm SIMD対応による高速化、16bit/HDR出力への対応などを検討していきます。
プレスリリース提供:PR TIMES
記事提供:PRTimes