2012-03-28 5 views
0

Ich möchte die JPEG-Bild R_G_B Kanäle als getrennte Bilder in Jlabel und die Y-Cb-Cr-Kanäle auch zeigen, ich habe die Arrays, aber nicht wissen, wie sie in Bilder konvertieren ///bekommen RGB-YCbCr Komponenten des Bildes

Edit: thanx sehr viel, das ist die Methode, die ich hier schreibe, jetzt kann es angezeigt werden nur das linke obere Viertel des Bildes und zeigt es in einer blauen Farbe unabhängig von dem Farbkanal war?

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

     } 

Antwort

0

Eine einfache und schnelle Art und Weise eine Anordnung von Pixeln in ein Bild zu erhalten, wird unter Verwendung von BufferedImage:

dieses Beispiel wird ein Bild Bit-Graustufen 8 erzeugt und ruft für die es einen ‚Pixelpuffer‘:

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

Dies funktioniert auch mit RGB:

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

jetzt Sie können festlegen, Pixel nur durch Schreiben in die pixels Array wie pixels[x + y * w] = value und die Ergebnisse sind sofort sichtbar.

+0

Ich habe diesen Code verwendet, aber es gibt eine Ausnahme "java.lang.ArrayIndexOutOfBoundsException" Was ist los? BufferedImage img = neu BufferedImage (width, height, BufferedImage.TYPE_INT_RGB); int [] Pixel = ((DataBufferInt) img.getRaster(). GetDataBuffer()). GetData(); for (y = 0; y muhannad

+0

Erstens, ohne weitere Informationen kann ich wirklich nicht beantworten Sie Frage (in welcher Zeile des obigen Codes wird die Ausnahme ausgelöst?), Und zweitens: Sie müssen keine 'raster.setPixel' oder andere Sachen, wie ich sagte: ... und die Ergebnisse sind sofort sichtbar. Sie arbeiten direkt an den gepufferten Bilddaten. – Neet

+0

der bearbeitete Code ist über – muhannad