【问题标题】:Affine transformation in linear RGB space线性 RGB 空间中的仿射变换
【发布时间】:2016-12-15 22:09:16
【问题描述】:

如果使用以下 Java 代码转换 linear RGB color space 中的源栅格,则在应用过滤器时会引发 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,然后再进行转换。

【问题讨论】:

  • 您使用的是什么 Java 版本和操作系统?由于AffineTransformOp 在后台使用本机代码,这可能会有所不同。我目前在 Windows 上使用 Java 8,并且可以重现您的异常。稍后,当我与 MBP 重聚时,将在 OS X 上尝试 Java 7/8。 ;-)
  • @haraldK 在 Oracle JDK 8 的 Windows 10 上测试。
  • 对于 OS X、Oracle Java 7、8 和 9ea 也是如此。

标签: java image-processing graphics2d


【解决方案1】:

并没有真正解释为什么您的代码不起作用*,但至少您可以轻松解决该问题。而不是过滤BufferedImages:

op.filter(srcImage, dstImage);

...你可以过滤Rasters:

op.filter(srcRaster, dstRaster);

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

只要色彩空间和光栅布局相同,色彩空间的类型并不重要。


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

【讨论】:

  • 我忽略了这个选项。如果两个颜色空间匹配,很高兴听到它没有副作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 2016-01-07
  • 1970-01-01
相关资源
最近更新 更多