我需要将加载到BufferedImage的位图中的颜色从RGB转换为YCbCr(亮度和2通道色度)并在处理之后进行转换。如何使用BufferedImage和YCbCr色彩空间?
我在每个像素的主要方法中用像rgb2ycbcr()这样的函数做了它,但它并不是那么聪明的解决方案。我应该使用ColorSpace和ColorModel类以正确的颜色空间获取BufferedImage。这将是更灵活的方法,但我不知道该怎么做。
我迷路了,我需要一些提示。有人能帮助我吗?
我需要将加载到BufferedImage的位图中的颜色从RGB转换为YCbCr(亮度和2通道色度)并在处理之后进行转换。如何使用BufferedImage和YCbCr色彩空间?
我在每个像素的主要方法中用像rgb2ycbcr()这样的函数做了它,但它并不是那么聪明的解决方案。我应该使用ColorSpace和ColorModel类以正确的颜色空间获取BufferedImage。这将是更灵活的方法,但我不知道该怎么做。
我迷路了,我需要一些提示。有人能帮助我吗?
当我明白你的问题,要做到以下几点:
负载RGB图像 - >过程YCbCr图像 - >使用RGB图像再次
而且你想让我们帮助你,使这个过程尽可能无缝。首先,你希望我们给你一个简单的方法来避免->
(转换)部分。我想看看BufferedImage
documentation。看来,好像不存在一种方法来改变曾经创建的BufferedImage
的ColorSpace
。
您可以使用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。
但我仍然不知道该怎么做。我迷路了,我可以找到任何超出文档类的东西。这与静态函数非常不同。任何例子? 我正在编写JPEG算法的实现,我需要转换为YCbCr并在分片之前分开通道。现在我正在处理许多数组和函数。这不像我想要的那么灵活。 – Szopinski 2010-05-06 12:07:27
也许'BufferedImage'类不是你正在寻找的。如果你只是想让你的程序化Jpeg(de-)编码器做更多的类OOP尝试别的东西。一种可能性是为Jpeg(解除)编码流水线的每一步创建一个类。 – ablaeul 2010-05-06 19:03:39
好的。从开始:) 我需要打开图像,分开Y,Cb,Cr通道,并在压缩之前对每个通道进行分段。 所以我需要BufferedImage与getY(),getCb,getCr()方法或三个与每个通道。怎么做? – Szopinski 2010-05-07 07:18:30