まず、質問につながる状況/要件について説明したいと思います。
私たちのWebアプリケーションでは、IE 8以下ではCMYK画像を表示できないため、CMYK画像(JPEG)をサポートできません。したがって、誰かがそのような画像をアップロードして拒否したいときを検出する必要があります。
残念ながら、JavaのImageIOはそれらの画像を読み取らないか、検出された色空間を取得できません。JPEGImageReader
デバッグから、内部的に色空間コード11(つまり)を取得しているように見えJCS_YCCK
ますが、その情報に安全にアクセスできません。
リーダーに画像タイプを問い合わせると、CMYKは何も得られないので、と仮定するかもしれませんno image types = unsupported image
。
読み取り可能かどうかをテストするために、イメージングツールを使用してソースCMYK画像をRGBに変換しました(「CMYKはサポートされていません」というメッセージが表示されたときに管理者の手順をシミュレートしようとしました)。ただし、(ソースにコメント!)3コンポーネントRGB色空間を想定しJPEGImageReader
ているため、その画像は読み取られませんが、画像ヘッダーは4コンポーネント(おそらくRGBAまたはARGB)を報告するため、がスローされます。IllegalArgumentException
したがって、ImageIOはオプションではありません。これは、画像の色空間を確実に取得できず、内部的な理由で細かい画像(ブラウザで表示できる)が受け入れられない理由を管理者に伝えることができないためです。エラー。
これにより、私はJAI ImageIOを試してみました。このCLibJPEGImageReader
画像は、優れた機能を果たし、すべてのテスト画像を正しく読み取ります。
ただし、他のアプリケーションもホストする可能性のあるJBossにアプリケーションをデプロイしているため、それらを可能な限り分離しておく必要があります。ちなみに、JAI ImageIOをJREにインストールするか、ネイティブライブラリを使用できるようにする必要があります。そのため、他のアプリケーションもそれらにアクセスでき、副作用が発生する可能性があります(少なくとも多くのテストを行って、そうではないことを確認します)。
これが質問の説明です。ここでも、 CMYK画像を確実に検出して変換するJAI ImageIOに代わる純粋なJavaの代替品はありますか?
前もって感謝します、
トーマス