如果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并在之后进行转换。
答案 0 :(得分:2)
并不是解释为什么你的代码不起作用*,但至少你可以轻松地解决这个问题。而不是过滤BufferedImage
s:
op.filter(srcImage, dstImage);
...您可以过滤Raster
s:
op.filter(srcRaster, dstRaster);
这将产生相同的结果(如在sRGB颜色空间中的两个图像上使用filter(BufferedImage, BufferedImage)
)。
只要颜色空间和栅格布局相同,颜色空间的类型就不重要了。
*)我坚信这是一个Java(JRE)错误,应该报告给Oracle / OpenJDK。