Java 获取图像的RGB YCbCr分量

Java 获取图像的RGB YCbCr分量,java,image-processing,jpeg,rgb,Java,Image Processing,Jpeg,Rgb,我想将jpeg图像R_G_B通道显示为jlabel和Y-Cb-Cr通道中的分离图像,我得到了阵列,但不知道如何将它们转换为图像 /// 编辑: thanX非常好,这是我正在写的方法,现在它可以只显示图像的左上角,并以蓝色显示,无论颜色通道是什么 public void getRGB_YCC(int width,int height,String inFileName) { R=new int[height][width];G=new int[height][w

我想将jpeg图像R_G_B通道显示为jlabel和Y-Cb-Cr通道中的分离图像,我得到了阵列,但不知道如何将它们转换为图像 ///

编辑: thanX非常好,这是我正在写的方法,现在它可以只显示图像的左上角,并以蓝色显示,无论颜色通道是什么

      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));

        }
public void getRGB_YCC(整数宽度、整数高度、字符串填充名){
R=新整型[高度][宽度];G=新整型[高度][宽度];
B=新整型[高度][宽度];Y=新整型[高度][宽度];
Cb1=新整数[高度][宽度];Cr1=新整数[高度][宽度];
最终整数值[]=新整数[宽度*高度];
int r,g,b,Y_ch,Cb,Cr,Y,x;
final PixelGrabber grabber=新的PixelGrabber(image.getSource(),0,0,宽度,高度,值,0,宽度);
试一试{
if(grabber.grabPixels()!=true){
试一试{
抛出新的AWTException(“Grabber返回false:+Grabber.getStatus());
}捕获(最终例外e){};
}
}catch(最终中断异常e){};
int指数=0;
对于(y=0;y<高度;++y){
对于(x=0;x>16&0xff;
g=值[索引]>>8&0xff;
b=值[索引]&0xff;
Y_ch=(int)(0.299*r+0.587*g+0.114*b);
Cb=128+(整数)(-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;
索引++;
}
}
BuffereImage img=新的BuffereImage(宽度、高度、BuffereImage.TYPE_INT_RGB);
int[]像素=((DataBufferInt)img.getRaster().getDataBuffer()).getData();

对于(y=0;y而言,将像素阵列放入图像中的一种简单而快速的方法是使用:

此示例创建灰度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(宽度、高度、BufferedImage.TYPE_INT_RGB);int[]pixels=((DataBufferInt)img.getRaster().getDataBuffer()).getData();for(y=0;yFirst,如果没有更多信息,我真的无法回答您的问题(在上述代码的哪一行引发异常?),第二:你不需要做任何
graster.setPixel
或其他事情,就像我说的:…结果立即可见。你直接处理缓冲的图像数据。你写入
INT\u RGB
缓冲的图像,所以你的整数中有三个颜色通道:
0xrrggbb
。目前你在只在蓝色通道中显示en 0和255。若要获得不同的颜色,请移动值。我真的非常感谢您,但仍然显示了图像的四分之一,而没有显示整个图像,我不知道为什么?若要显示YCbCr通道,可以键入_INT _RGB工作吗?有人能告诉我我我做错了什么,使整个图像无法显示,然后显示吗只是其中的一部分????????????