2011-01-06 7 views
4

ich eine ganze Reihe von RGB-Pixeln, die etwa so aussieht:erstellen eine gepufferte Bild von RGB-Pixelwerte

pixels[0] = <rgb-value of pixel(0,0)> 
pixels[1] = <rgb-value of pixel(1,0)> 
pixels[2] = <rgb-value of pixel(2,0)> 
pixels[3] = <rgb-value of pixel(0,1)> 
...etc... 

Und ich versuche zu erstellen BufferedImage von ihm. Ich habe folgendes versucht:

BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
img.getRaster().setPixels(0, 0, width, height, pixels); 

Aber das resultierende Bild hat Probleme mit den Farbbändern. Das Bild ist unklar und es gibt diagonale und horizontale Linien.

Was ist der richtige Weg, um das Bild mit den RGB-Werten zu initialisieren?

EDIT: Hier ist, was mein Bild wie alt text

Dank sieht, Jeff

+0

setDataElements (...) funktioniert gut für mich. Ihre int-Werte müssen falsch sein. Veröffentlichen Sie Ihre SSCCE, um das Problem zu demonstrieren. – camickr

+0

@camickr, ich denke du hast Recht und das meine Pixelwerte falsch sind. Ich schaue mir das ein bisschen genauer an und poste dann zurück. –

+0

Dies sieht wie schlechte Datenausrichtung aus. Ihre Pixel sind 32-Bit-Inte, aber ein Integer-RBG-Format hat nur 24 Bit. Sie sollten versuchen, eine Pixelstruktur mit 3 Bytes zu erstellen und stattdessen ein Array davon zu übergeben. – Hannesh

Antwort

3

Versuchen setDataElements statt setPixels.

Eine weitere Option ist für das Bild, um das Array zu teilen, anstatt das Kopieren von ihm (this answer für ein Beispiel sehen.)

+0

+1, cool, ich habe den Unterschied zwischen setDataElements und setPixels gelernt. – camickr

+0

Ich habe versucht SetDataElements, aber ich bekomme immer noch das gleiche Problem. Ich habe ein Bild von dem, was ich sehe, hinzugefügt. Vielleicht wird es einen Hinweis darauf geben, was es verursachen könnte. –

1

nicht sicher, wie es mit einem einzelnen Array-Wert zu tun. Ich glaube, Sie drei Array-Werte benötigen, die Farbe zu spezifizieren, wenn Sie TYPE_INT_RGB verwenden:

import java.awt.*; 
import java.awt.image.*; 
import javax.swing.*; 

public class ImageFromArray2 extends JFrame 
{ 
    int width = 50; 
    int height = 50; 
    int imageSize = width * height; 

    public ImageFromArray2() 
    { 
     JPanel panel = new JPanel(); 
     getContentPane().add(panel); 
     int[] pixels = new int[imageSize * 3]; 

     // Create Red Image 

     for (int i = 0; i < imageSize * 3; i += 3) 
     { 
      pixels[i] = 255; 
      pixels[i+1] = 0; 
      pixels[i+2] = 0; 
     } 

     panel.add(createImageLabel(pixels)); 

     // Create Green Image 

     for (int i = 0; i < imageSize * 3; i += 3) 
     { 
      pixels[i] = 0; 
      pixels[i+1] = 255; 
      pixels[i+2] = 0; 
     } 

     panel.add(createImageLabel(pixels)); 

     // Create Blue Image 

     for (int i = 0; i < imageSize * 3; i += 3) 
     { 
      pixels[i] = 0; 
      pixels[i+1] = 0; 
      pixels[i+2] = 255; 
     } 

     panel.add(createImageLabel(pixels)); 

     // Create Cyan Image 

     for (int i = 0; i < imageSize * 3; i += 3) 
     { 
      pixels[i] = 0; 
      pixels[i+1] = 255; 
      pixels[i+2] = 255; 
     } 

     panel.add(createImageLabel(pixels)); 

    } 

    private JLabel createImageLabel(int[] pixels) 
    { 
     BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
     WritableRaster raster = image.getRaster(); 
     raster.setPixels(0, 0, width, height, pixels); 
     JLabel label = new JLabel(new ImageIcon(image)); 
     return label; 
    } 

    public static void main(String args[]) 
    { 
     JFrame frame = new ImageFromArray2(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 
} 
+1

TYPE_INT_RGB verwendet einen einzelnen Int pro Pixel; OP gibt an, dass jedes Element von int [] einen RGB-Wert hat. –

+0

@MIchael Brewer-Davis, würden Sie denken, dass TYPE_INT_RGB eine einzelne int pro Pixel-Einheit verwendet, aber das scheint nicht der Fall zu sein, wenn Sie die Methode setPixel (...) verwenden, weshalb die Frage gestellt wurde. Ich habe eine Lösung zur Verfügung gestellt, die zeigt, wie man die Methode setPixel (...) verwendet. Die beste Antwort ist die Verwendung der Methode setDataElements (...). – camickr

-1

Der Grund kann nicht Sie das richtige Bild erhalten, ist, dass diese Pixel der RGB-Farben enthalten, um auch jede pix setzen Sie am meisten tun der nächste

double[] pixelsArr=new double[4]; 
pixelsArr[0]=(Integer.parseInt(string2.trim())>>16) & 0xFF; 
pixelsArr[1]=(Integer.parseInt(string2.trim())>>8) & 0xFF; 
pixelsArr[2]=(Integer.parseInt(string2.trim())) & 0xFF; 
pixelsArr[3]=0xFF; 
img.getRaster().setPixels(col,row,1,1, pixelsArr); 

Zeichenfolge2 eine ganze Zahl Pixel col die Position jedes pix und derselben Reihe und 1,1 ist die Größe jedes Pixels.