2016-12-13 9 views
1

linear RGB color spaceのソースラスタを次のJavaコードを使用して変換すると、フィルタが適用されたとき(最終行)にjava.awt.image.ImagingOpException: Unable to transform src imageエラーがスローされます。リニアRGB空間でのアフィン変換

ColorModel linearRGBColorModel = new DirectColorModel(
     ColorSpace.getInstance(ColorSpace.CS_LINEAR_RGB), 32, 
     0xff0000, 0xff00, 0xff, 0xff000000, true, DataBuffer.TYPE_INT); 

WritableRaster srcRaster = linearRGBColorModel.createCompatibleWritableRaster(100, 100); 
WritableRaster dstRaster = linearRGBColorModel.createCompatibleWritableRaster(200, 200); 

BufferedImage srcImage = new BufferedImage(linearRGBColorModel, srcRaster, false, null); 
BufferedImage dstImage = new BufferedImage(linearRGBColorModel, dstRaster, false, null); 

AffineTransform aff = new AffineTransform(); 
aff.scale(2.0, 2.0); 

AffineTransformOp op = new AffineTransformOp(aff, null); 
op.filter(srcImage, dstImage); 

代わりにColorSpace.CS_sRGBを使用すると、正常に動作します。

実際には、グレーのぼかし線で画像を操作します。そのようなソースの変換はJDKの機能が欠けているのでしょうか、それとも全く意味がありませんか?

とにかく、ピクセルをsRGBに再計算し、その後変換を行う予定です。

+0

使用しているJavaのバージョンとOSは何ですか? AffineTransformOpはフードの下でネイティブコードを使用するので、これは違いをもたらすかもしれません。私は現在Windows上でJava 8を使用しており、例外を再現することができます。後でOS XでJava 7/8を試してみると、私はMBPと再会します。 ;-) – haraldK

+0

@haraldK Oracle JDK 8のWindows 10でテスト済み。 –

+0

OS X、Oracle Java 7,8および9eaと同じです。 – haraldK

答えて

2

実際にコードが機能しない理由についての説明はありませんが、少なくともあなたは簡単に問題を回避することができます。代わりにBufferedImageのフィルタリング:(sRGB色空間に二つの画像にfilter(BufferedImage, BufferedImage)を使用するなど)と同じ結果になります

op.filter(srcRaster, dstRaster); 

op.filter(srcImage, dstImage); 

を...あなたはRaster Sをフィルタリングすることができます。

カラースペースとラスタレイアウトが同じである限り、タイプのの色空間は実際問題ではありません。


*)これはJava(JRE)のバグであると信じており、Oracle/OpenJDKに報告する必要があります。

+0

私はこのオプションを見落としました。両方のカラースペースが一致しても、それは副作用がないと聞くのは良いです。 –

関連する問題