我需要将加载到BufferedImage的位图中的颜色从RGB转换为YCbCr(亮度和2通道色度)并在处理后返回。
我在每个像素的main方法中使用了像rgb2ycbcr()这样的函数,但它不是那么聪明的解决方案。我应该使用ColorSpace和ColorModel类来获得具有正确颜色空间的BufferedImage。这将是更灵活的方法,但我不知道该怎么做。
我迷路了,我需要一些提示。有人可以帮帮我吗?
答案 0 :(得分:2)
我理解你的问题,你想要做以下事情:
加载RGB图像 - > 处理YCbCr图像 - > 再次使用RGB图像
您希望我们为您提供帮助,使此过程尽可能无缝。首先,您希望我们为您提供一种避免->
(转换)部分的简单方法。
我看了BufferedImage
documentation。看起来似乎没有办法改变曾经创建的ColorSpace
的{{1}}。
您可以创建一个带有YCbCr色彩空间的新BufferedImage
,以便您可以使用预定义的ICC_ColorSpace
。然后,您可以通过BufferedImage
将旧图像中的数据复制到YCbCr颜色空间,进行图像处理,然后通过ColorSpace.fromRGB
再次转换。此方法要求您通过现有方法在处理之前和之后完全转换图像。此外,您必须知道ColorSpace.toRGB
如何将图像转换为YCbCr色彩空间。否则你无法知道哪个数组索引对应于同一个像素。
如果您只想在RGB周围创建一个包装器 - ICC_ColorSpace
,可让您操作此图像,就像它是YCbCr图像一样,BufferedImage
无法实现。
编辑:
要转换BufferedImage
使用ColorConvertOp
的颜色空间。代码看起来像这样:
BufferedImage
这要求您编写自己的ColorConvertOp cco = new ColorConvertOp(new YCbCrColorSpace(), null);
BufferedImage ycbcrImage = cco.filter( oldRGBImage, null );
课程,或者您可以下载并使用提到的here课程。如果您只想加载JPEG图像,则应使用predefined classes。