线性RGB空间中的仿射变换

时间:2016-12-13 11:22:10

标签: java image-processing graphics2d

如果linear RGB color space中的源栅格使用以下Java代码进行转换,则在应用滤镜(最后一行)时会引发java.awt.image.ImagingOpException: Unable to transform src image错误。

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并在之后进行转换。

1 个答案:

答案 0 :(得分:2)

并不是解释为什么你的代码不起作用*,但至少你可以轻松地解决这个问题。而不是过滤BufferedImage s:

op.filter(srcImage, dstImage);

...您可以过滤Raster s:

op.filter(srcRaster, dstRaster);

这将产生相同的结果(如在sRGB颜色空间中的两个图像上使用filter(BufferedImage, BufferedImage))。

只要颜色空间和栅格布局相同,颜色空间的类型就不重要了。

*)我坚信这是一个Java(JRE)错误,应该报告给Oracle / OpenJDK。