Java 如何使用BuffereImage和YCbCr颜色空间?

Java 如何使用BuffereImage和YCbCr颜色空间?,java,colors,bufferedimage,Java,Colors,Bufferedimage,我需要将加载到BuffereImage的位图中的颜色从RGB转换为YCbCr(亮度和2通道色度),并在处理后返回 我在main方法中为每个像素使用了像rgb2ycbcr()这样的函数,但这不是一个聪明的解决方案。我应该使用ColorSpace和ColorModel类来获得具有正确颜色空间的BuffereImage。这将是一种更灵活的方法,但我不知道如何做到这一点 我迷路了,我需要一些提示。有人能帮我吗?我理解了你的问题,你想做以下事情: 加载RGB图像->处理YCbCr图像->再次使用RGB图像

我需要将加载到BuffereImage的位图中的颜色从RGB转换为YCbCr(亮度和2通道色度),并在处理后返回

我在main方法中为每个像素使用了像rgb2ycbcr()这样的函数,但这不是一个聪明的解决方案。我应该使用ColorSpace和ColorModel类来获得具有正确颜色空间的BuffereImage。这将是一种更灵活的方法,但我不知道如何做到这一点


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

我理解了你的问题,你想做以下事情:

加载RGB图像->处理YCbCr图像->再次使用RGB图像

你希望我们帮助你,让这个过程尽可能无缝。首先,您希望我们为您提供一种避免
->
(转换)部件的简单方法

嗯,我查了一下。似乎不存在一种方法来更改一次创建的
buffereImage
ColorSpace

您可以创建一个新的
buffereImage
,其中包含一个YCbCr颜色空间,您可以使用预定义的颜色空间。然后,可能通过
颜色空间将数据从旧图像复制。从RGB
复制到YCbCr颜色空间,进行图像处理,然后通过
颜色空间.toRGB
再次转换。此方法要求您通过现有方法在处理前后完全转换图像。此外,您还必须知道,
ICC_ColorSpace
如何将图像转换为YCbCr颜色空间。否则,您无法知道哪些阵列索引对应于同一像素

如果您只想在RGB-
BuffereImage
周围创建一个包装器,让您可以像处理YCbCr图像一样处理此图像,那么使用
BuffereImage
是不可能的

编辑: 要转换
缓冲区图像的颜色空间,请使用。代码如下所示:

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

这要求您要么编写自己的
ColorSpace
类,要么下载并使用上面提到的类。如果您只想加载JPEG图像,您应该使用。

但我仍然不知道如何加载。我迷路了,我能找到任何高于类文档的东西。这与静态函数非常不同。有什么例子吗?我正在编写JPEG算法的实现,我需要转换成YCbCr,并在分割之前分离通道。现在我正在处理许多数组和函数。这不是我想要的那么灵活。也许
buffereImage
类不是您想要的。如果您只是想让程序Jpeg(de-)编码器更像OOP,请尝试其他方法。一种可能性是为Jpeg(反)编码管道的每一步创建一个类。从一开始:)我需要打开图像,分离Y、Cb、Cr通道,并在压缩之前分割每个通道。所以我需要BuffereImage和getY()、getCb、getCr()方法,或者三个方法,每个方法有一个通道。怎么做?不要为此使用
buffereImage
。您可以编写自己想要的类,或者使用[
WritableRaster
][1]使用[
Raster
][2]的文档查看像素的存储方式。因为对这个答案的讨论太长了,这将是我最后的评论。[1]: [2]: