【问题标题】:How to work with BufferedImage and YCbCr colorspace?如何使用 BufferedImage 和 YCbCr 颜色空间?
【发布时间】:2010-05-06 09:27:16
【问题描述】:

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

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

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

【问题讨论】:

    标签: java colors bufferedimage


    【解决方案1】:

    据我了解您的问题,您希望执行以下操作:

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

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

    好吧,我查看了BufferedImage documentation。似乎没有办法更改曾经创建的BufferedImageColorSpace

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

    如果您只想围绕 RGB-BufferedImage 创建一个包装器,让您可以像处理 YCbCr 图像一样操作此图像,那么 BufferedImage 则无法实现。

    编辑: 要转换@​​987654339@ 的颜色空间,请使用ColorConvertOp。代码看起来像这样:

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

    这需要您编写自己的ColorSpace 类,或者您可以下载并使用提到的here 类。如果您只想加载 JPEG 图像,您应该使用 predefined classes

    【讨论】:

    • 但我仍然不知道该怎么做。我迷路了,我可以在类文档之上找到任何东西。这与静态函数有很大不同。有什么例子吗?我正在编写 JPEG 算法的实现,我需要在分段之前转换为 YCbCr 并分离通道。现在我正在处理许多数组和函数。这不像我想要的那样灵活。
    • 也许BufferedImage 类不是您想要的。如果您只是想让您的程序 Jpeg(去)编码器制作更多类似 OOP 的内容,请尝试其他方法。一种可能性是为 Jpeg(反)编码管道的每个步骤创建一个类。
    • 好的。从一开始 :) 我需要打开图像,分离 Y、Cb、Cr 通道并在压缩之前对每个通道进行分段。所以我需要带有 getY()、getCb、getCr() 方法的 BufferedImage 或三个,每个都有一个通道。该怎么做?
    • 不要为此使用BufferedImage。要么编写自己的类做你想做的事,要么使用 [WritableRaster][1] 使用 [Raster][2] 的文档来查看像素是如何存储的。因为对这个答案的讨论变得非常长,这将是我在这里的最后评论。 [1]:java.sun.com/javase/6/docs/api/java/awt/image/… [2]:java.sun.com/javase/6/docs/api/java/awt/image/Raster.html
    猜你喜欢
    • 1970-01-01
    • 2011-04-26
    • 2018-08-26
    • 1970-01-01
    • 2016-09-25
    • 2013-06-26
    • 1970-01-01
    • 2018-06-15
    相关资源
    最近更新 更多