【问题标题】:get RGB-YCbCr components of image获取图像的 RGB-YCbCr 分量
【发布时间】:2012-03-29 19:51:03
【问题描述】:

我想在 jlabel 和 Y-Cb-Cr 通道中将 jpeg 图像 R_G_B 通道显示为单独的图像,我得到了数组但不知道如何将它们转换为图像 ///

编辑: 非常感谢X,这是我写的方法,现在它可以只显示图像的左上角四分之一,并且无论颜色通道是什么都显示为蓝色?

      public void getRGB_YCC(int width,int height,String inFileName) {
            R=new int[height][width];G=new int[height][width];
            B=new int[height][width];Y=new int[height][width];
            Cb1=new int[height][width];Cr1=new int[height][width];
            final int values[] = new int[width * height];
            int r, g, b, Y_ch,Cb,Cr, y, x;

            final PixelGrabber grabber = new PixelGrabber(image.getSource(), 0, 0,width,height, values, 0, width);

                try {
                if (grabber.grabPixels() != true) {
                try {
                throw new AWTException("Grabber returned false: " + grabber.getStatus());
                } catch (final Exception e) {};
                }
                } catch (final InterruptedException e) {};
                int index = 0;
        for (y = 0; y < height; ++y) {
                for (x = 0; x < width; ++x) {
                r = values[index] >> 16 & 0xff;
                g = values[index] >> 8 & 0xff;
                b = values[index] & 0xff;

                Y_ch= (int)(0.299 * r + 0.587 * g + 0.114 * b);
                Cb= 128 + (int) (-0.16874 * r - 0.33126 * g + 0.5 * b);
                Cr= 128 + (int)(0.5 * r - 0.41869 * g - 0.08131 * b);
                R [y][x]=r;
                G [y][x]=g;
                B [y][x]=b;
                Y [y][x]=Y_ch; 
                Cb1[y][x]=Cb; 
                Cr1[y][x]=Cr;
                index++;
                }
        }
    BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    int[] pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData();
    for(  y=0;y<height;y++)
    {
    for(  x=0;x<width;x++)
    {
        pixels[x + y*width] =R[y][x]<<16;
    }
    }

     jLabel15.setIcon(new ImageIcon(img));

        }

【问题讨论】:

    标签: java image-processing jpeg rgb


    【解决方案1】:

    使用BufferedImage 将像素数组放入图像中的一种简单而快速的方法是:

    此示例创建一个灰度 8 位图像并为其检索“像素缓冲区”:

    BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_BYTE_GRAY);
    byte[] pixels = ((DataBufferByte)img.getRaster().getDataBuffer()).getData();
    

    这也适用于 RGB:

    BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
    int[] pixels = ((DataBufferInt)img.getRaster().getDataBuffer()).getData();
    

    您现在可以通过像pixels[x + y * w] = value 一样写入pixels 数组来设置像素,结果立即可见。

    【讨论】:

    • 我使用了这段代码但是有一个异常“java.lang.ArrayIndexOutOfBoundsException”怎么了? BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); int[] 像素 = ((DataBufferInt)img.getRaster().getDataBuffer()).getData(); for( y=0;y
    • 首先,如果没有更多信息,我真的无法回答您的问题(上面代码的哪一行引发了异常?),其次:您不需要做任何raster.setPixel 或其他东西,正如我所说:......结果立即可见。您确实可以直接处理缓冲的图像数据。
    • 您写入一个INT_RGB 缓冲图像,因此您的整数中有三个颜色通道:0xrrggbb。目前,您仅在蓝色通道中写入 0 到 255 之间的值。要获得不同的颜色,请改变值。
    • 真的非常感谢你,但是还是显示了四分之一的图像,并没有显示整个图像,我不知道为什么? |显示 YCbCr 通道,TYPE_INT_RGB 可以工作吗?
    • 谁能告诉我我做错了什么,所以无法显示整个图像,而只显示其中的一部分????????????跨度>
    猜你喜欢
    • 2018-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 1970-01-01
    • 2018-11-14
    • 2018-06-15
    相关资源
    最近更新 更多