0

BufferedImageにロードされたビットマップの色をRGBからYCbCr(輝度と2チャンネルクロミナンス)に変換し、処理後に戻す必要があります。

各ピクセルのメインメソッドでrgb2ycbcr()のように使用される関数を使用して作成しましたが、それほどスマートなソリューションではありません。正しい色空間でBufferedImageを取得するには、ColorSpaceクラスとColorModelクラスを使用する必要があります。もっと柔軟な方法ですが、どうすればいいのかわかりません。

私は迷子になっていて、いくつかのヒントが必要です。誰かが私を助けることができますか?

4

1 に答える 1

2

私があなたの質問を理解したので、あなたは次のことをしたいと思います:

RGB画像をロード-> YCbCr画像を処理-> RGB画像を再度使用

そして、あなたは私たちがあなたを助けて、このプロセスを可能な限りシームレスにすることを望んでいます。->何よりもまず、 (変換する)部分を回避する簡単な方法を提供してほしいと思います。

BufferedImageさて、私はドキュメントを調べました。ColorSpace一度作成したのを変更する方法がないようですBufferedImage

BufferedImage事前定義されたを使用できるように、YCbCr色空間を使用して新しいを作成できますICC_ColorSpace。次に、古い画像からColorSpace.fromRGBYCbCr色空間にデータをコピーし、画像処理を行ってから、を介して再度変換しColorSpace.toRGBます。この方法では、既存の方法で処理する前後に画像を完全に変換する必要があります。ICC_ColorSpaceさらに、画像をYCbCr色空間に変換する方法を知っておく必要があります。そうしないと、どの配列インデックスが同じピクセルに対応しているかを知ることができません。

BufferedImageYCbCr画像であるかのように、この画像を操作できるRGB-のラッパーを作成したいだけの場合は、。では不可能BufferedImageです。

編集:使用の色空間を変換しBufferedImageますColorConvertOp。コードは次のようになります。

ColorConvertOp cco = new ColorConvertOp(new YCbCrColorSpace(), null);
BufferedImage ycbcrImage = cco.filter( oldRGBImage, null );

これには、独自のクラスを作成するか、ここColorSpaceに記載されているクラスをダウンロードして使用する必要があります。JPEG画像をロードするだけの場合は、事前定義されたクラスを使用する必要があります。

于 2010-05-06T10:38:29.327 に答える