2012-03-28 8 views
0

jpeg画像のR_G_BチャンネルをjlabelとY-Cb-Crチャンネルで別々の画像として表示したいのですが、配列を取得しましたが、画像に変換する方法はわかりません ///画像のRGB-YCbCrコンポーネントを取得する

編集:どうもありがとう 、これは私が書いている方法で、今では、画像のちょうど左上の四半期を表示し、色チャネルが何であっても青色で、それを表示することができますか?

 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アレイに書き込んでpixels[x + y * w] = valueのように表示すると、結果がすぐに表示されます。

+0

このコードを使用しましたが、例外 "java.lang.ArrayIndexOutOfBoundsException"があります 何が問題なのですか? BufferedImage img = new BufferedImage(width、height、BufferedImage.TYPE_INT_RGB); int [] pixels =((DataBufferInt)img.getRaster()。getDataBuffer())。getData();用 { (x = 0; X <幅; X ++) { 画素[X + Y *幅]はR [Y]を= [X](; Y <高Y ++ Y = 0)のための 。 } } WritableRasterラスタ=(WritableRaster)img.getData(); raster.setPixels(0,0、width、height、pixels); jLabel15.setIcon(new ImageIcon(img)); – muhannad

+0

最初に、私は本当にあなたの質問に答えることができません(上のコードのどの行に例外がスローされますか?)、2番目: 'raster.setPixel'やその他のものは必要ありません。言った:...結果はすぐに目に見える。バッファリングされたイメージデータを直接操作します。 – Neet

+0

編集されたコードは – muhannad

関連する問題