CMYK画像を検出するためのJai Imageioに代わる純粋なJava
-
26-10-2019 - |
質問
まず、質問につながる状況/要件を説明したいと思います。
Webアプリケーションでは、IE 8以下が表示できないため、CMYK画像(JPEG)をサポートできません。したがって、誰かがそのような画像をアップロードしたいときに検出し、それを否定する必要があります。
残念ながら、JavaのImageioはこれらの画像を読み取らないか、検出されたカラースペースを取得することができません。デバッグからそうです JPEGImageReader
内部的にカラースペースコード11を取得します(これは意味します JCS_YCCK
)しかし、私はその情報に安全にアクセスすることはできません。
画像タイプを読者に照会するとき、私はcmykのために何も得られないので、私は想像するかもしれません no image types = unsupported image
.
イメージングツールを使用してソースCMYKイメージをRGBに変換して、次に読みやすいかどうかをテストしました(「CMYKはサポートされていない」というメッセージを取得するときに管理者の手順をシミュレートしようとしました)。でも、 JPEGImageReader
そのため、その画像は読みません 仮定します (ソースにコメント!)3-Component RGBカラースペースですが、画像ヘッダーは4つのコンポーネント(RGBAまたはARGBかもしれません)を報告しています。 IllegalArgumentException
投げられます。
したがって、Imageioは画像の色空間を確実に取得できず、管理者に何らかの細かい画像(ブラウザで表示できる)が内部のために受け入れられない理由を伝えることができないため、オプションではありません。エラー。
これにより、Jai Imageioを試してみました CLibJPEGImageReader
優れた仕事をし、すべてのテスト画像を正しく読み取ります。
ただし、他のアプリケーションをホストする可能性のあるJBOSSにアプリケーションを展開しているため、可能な限り孤立したままにしたいと考えています。 afaik、私はJRE ImageioをJREにインストールするか、それらを使用するためにネイティブLIBを利用できるようにする必要があります。そうでないことを確認するために多くをテストするため)。
それが質問の説明であり、ここに再び来ます:CMYK画像を確実に検出し、おそらく変換するJai Imageioに代わる純粋なJavaの代替品はありますか?
前もって感謝します、
トーマス
解決
私たちのニーズに合わせて大丈夫なソリューションを見つけました: Apache Commons Sanselan. 。このライブラリは、JPEGヘッダーを非常に高速かつ正確に(少なくともすべてのテスト画像)、および他の多くの画像形式を読み取ります。
欠点は、JPEG画像データを読み取らないことですが、基本的なJREツールでそれを行うことができます。
変換のためにJPEG画像を読むのは非常に簡単です( ImageIO
読むことも拒否します):
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(new FileInputStream( new File(pFilename) ) );
BufferedImage sourceImg = decoder.decodeAsBufferedImage();
その後、Sanselanが画像が実際にCMykであると言ったら、ソース画像のラスターを取得して自分自身を変換します。
for( /*each pixel in the raster, which is represented as int[4]*/ )
{
double k = pixel[3] / 255.0;
double r = (255.0 - pixel[0])*k;
double g = (255.0 - pixel[1])*k;
double b = (255.0 - pixel[2])*k;
}
これにより、RGB画像が明るすぎたり暗くなったりしていないことで、非常に良い結果が得られます。ただし、なぜ乗算するのかわかりません k
明るくを防ぎます。 JPEGは実際にはネイティブコードでデコードされており、CMYK-> RGB変換は何か違うものを取得しました。視覚的な結果を確認するためにマルチップを試してみました。
誰かがこれに光を当てることができれば、私は感謝するでしょう。
他のヒント
純粋なジャワを投稿しました 解決 あらゆる種類のJPEG画像を読み、それらをRGBに変換するため。
それは次の事実に基づいて構築されています:
- Imageioは、cmykを使用してjpeg画像をバッファー画像として読み取ることができませんが、生のピクセルデータ(ラスター)を読み取ることができます。
- Sanselan(またはApache Commons Imagingは現在呼ばれています)を使用して、CMYK画像の詳細を読むことができます。
- 逆CMYK値(古いPhotoshopバグ)の画像があります。
- CMYKの代わりにYCCKを使用した画像があります(簡単に変換できます)。
Webアプリケーションでは、IE 8以下が表示できないため、CMYK画像(JPEG)をサポートできません。したがって、誰かがそのような画像をアップロードしたいときに検出し、それを否定する必要があります。
私はあなたに同意しません 「したがって、誰かがそのような画像をアップロードしたいときに検出し、それを否定する必要があります」. 。はるかにユーザーフレンドリーなポリシーは、CMYK以外の何かに変換することです。
あなたの投稿の残りの部分は、あなたが検出と変換の両方を求めることを見たという点で少し混乱しています。これは2つの異なるものです。繰り返しになりますが、画像を変換することははるかにユーザーフレンドリーだと思います。
太字で書く必要はありません:
CMYK画像を確実に検出し、おそらく変換するJai Imageioに代わる純粋なJavaの代替品はありますか?
Pure Java私は知りませんが、ImageMagickはCMYK画像をRGBのイメージに変換するために正常に動作します。電話 ImageMagick Javaのサーバー側では、実際には複雑ではありません。以前は外部プロセスを呼び出すことで手動でそれを行いましたが、今日ではラッパーがあります jmagick と im4java.
Java 7は、示されているように特別なパラメーターなしで直接Sunの実装を使用することを許可していないため、別の投稿に注意してください com.sun.image.codec.jpeg。*インポート.