2010-05-06 64 views
0

我需要将加载到BufferedImage的位图中的颜色从RGB转换为YCbCr(亮度和2通道色度)并在处理之后进行转换。如何使用BufferedImage和YCbCr色彩空间?

我在每个像素的主要方法中用像rgb2ycbcr()这样的函数做了它,但它并不是那么聪明的解决方案。我应该使用ColorSpace和ColorModel类以正确的颜色空间获取BufferedImage。这将是更灵活的方法,但我不知道该怎么做。

我迷路了,我需要一些提示。有人能帮助我吗?

回答

2

当我明白你的问题,要做到以下几点:

负载RGB图像 - >过程YCbCr图像 - >使用RGB图像再次

而且你想让我们帮助你,使这个过程尽可能无缝。首先,你希望我们给你一个简单的方法来避免->(转换)部分。我想看看BufferedImage documentation。看来,好像不存在一种方法来改变曾经创建的BufferedImageColorSpace

您可以使用YCbCr色彩空间创建一个新的BufferedImage,因为您可以使用预定义的ICC_ColorSpace。然后,您可能会通过ColorSpace.fromRGB将旧图像中的数据复制到YCbCr色彩空间,进行图像处理,然后再通过ColorSpace.toRGB进行转换。此方法要求您在通过现有方法处理之前和之后完全转换图像。此外,你必须知道,如何ICC_ColorSpace将您的图像转换为YCbCr色彩空间。否则,您无法知道哪个数组索引对应相同的像素。

如果你只是想创建一个RGB-BufferedImage的包装,让你操纵这个图像,就好像它是一个YCbCr图像,这是不可能的BufferedImage

编辑: 要转换BufferedImage使用ColorConvertOp的色彩空间。该守则将是这个样子:

ColorConvertOp cco = new ColorConvertOp(new YCbCrColorSpace(), null); 
BufferedImage ycbcrImage = cco.filter(oldRGBImage, null); 

这需要您无论是写自己的ColorSpace类或者你可以下载和使用的类提到here。如果您只想加载JPEG图像,则应使用predefined classes

+0

但我仍然不知道该怎么做。我迷路了,我可以找到任何超出文档类的东西。这与静态函数非常不同。任何例子? 我正在编写JPEG算法的实现,我需要转换为YCbCr并在分片之前分开通道。现在我正在处理许多数组和函数。这不像我想要的那么灵活。 – Szopinski 2010-05-06 12:07:27

+0

也许'BufferedImage'类不是你正在寻找的。如果你只是想让你的程序化Jpeg(de-)编码器做更多的类OOP尝试别的东西。一种可能性是为Jpeg(解除)编码流水线的每一步创建一个类。 – ablaeul 2010-05-06 19:03:39

+0

好的。从开始:) 我需要打开图像,分开Y,Cb,Cr通道,并在压缩之前对每个通道进行分段。 所以我需要BufferedImage与getY(),getCb,getCr()方法或三个与每个通道。怎么做? – Szopinski 2010-05-07 07:18:30