16

まず、質問につながる状況/要件について説明したいと思います。

私たちの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の代替品はありますか?

前もって感謝します、

トーマス

4

4 に答える 4

14

私たちのニーズに合った解決策を見つけました:ApacheCommonsSanselan。このライブラリは、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変換では別の状態になります。乗算を試して、視覚的な結果を確認しました。

誰かがこれに光を当てることができれば、私は感謝するでしょう。

于 2011-08-01T16:20:23.500 に答える
5

あらゆる種類のJPEG画像を読み取ってRGBに変換するための純粋なJavaソリューションを投稿しました。

これは、次の事実に基づいています。

  • ImageIOは、バッファリングされた画像としてCMYKを使用してJPEG画像を読み取ることはできませんが、生のピクセルデータ(ラスター)を読み取ることはできます。
  • Sanselan(または現在呼ばれているApache Commons Imaging)を使用して、CMYK画像の詳細を読み取ることができます。
  • CMYK値が反転した画像があります(Photoshopの古いバグ)。
  • CMYKの代わりにYCCKを使用した画像があります(簡単に変換できます)。
于 2012-08-26T18:21:06.387 に答える
3

java 7では、 import com.sun.image.codec.jpeg。*に示されているように、特別なパラメーターなしでSunの実装を直接使用することはできないため、別の投稿に注意してください。

于 2014-01-10T12:54:24.587 に答える
1

私たちのWebアプリケーションでは、IE 8以下ではCMYK画像を表示できないため、CMYK画像(JPEG)をサポートできません。したがって、誰かがそのような画像をアップロードして拒否したいときを検出する必要があります。

私はあなたの「誰かがそのような画像をアップロードしてそれを拒否したいときを検出する必要がある」というあなたの意見に同意しません。はるかにユーザーフレンドリーなポリシーは、CMYK以外のものに変換することです。

あなたの投稿の残りの部分は、2つの異なるものである検出と変換の両方を要求しているという点で少し混乱しています。繰り返しになりますが、画像の変換ははるかにユーザーフレンドリーだと思います。

太字で書く必要はありません:

CMYK画像を確実に検出して変換するJAIImageIOに代わる純粋なJavaはありますか?

純粋なJavaはわかりませんが、ImageMagickはCMYK画像をRGB画像に変換するために正常に機能します。Javaからサーバー側でImageMagickを呼び出すことは、実際には複雑ではありません。以前は外部プロセスを呼び出して手動で実行していましたが、現在はJMagickim4javaなどのラッパーがあります。

于 2011-07-26T12:38:50.577 に答える