2012-03-28 94 views
0

我想要将jpeg图像R_G_B通道显示为jlabel和Y-Cb-Cr通道中的分离图像,我也获得了这些数组,但不知道如何将它们转换为图像 ///获取图像的RGB-YCbCr组件

编辑: 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)); 

     } 

回答

0

一个简单的和快速的方式来获得像素阵列成图像是使用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阵列,结果即刻可见。

+0

我用这个代码,但有一个异常“java.lang.ArrayIndexOutOfBoundsException” 有什么问题? BufferedImage img = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB); int [] pixels =((DataBufferInt)img.getRaster()。getDataBuffer())。getData(); 为(Y = 0; Y <高度; Y ++) { 为(X = 0; X <宽度; X ++) { 像素[X + Y *宽度] = R [Y] [X]; } } WritableRaster raster =(WritableRaster)img.getData(); raster.setPixels(0,0,width,height,pixels); jLabel15.setIcon(new ImageIcon(img)); – muhannad 2012-03-28 11:23:41

+0

首先,没有更多的信息,我真的不能回答你的问题(上面代码的哪一行会引发异常?),第二:你不需要做任何'raster.setPixel'或其他的东西,因为我说:...并且结果立即可见。您直接在缓冲的图像数据上工作。 – Neet 2012-03-28 11:26:42

+0

编辑后的代码高于 – muhannad 2012-03-28 12:39:03