Pixel zeichnen

Status
Nicht offen für weitere Antworten.

Roland

Mitglied
Hallo Leute,

ich habe hier ein kleines Problem und komme nicht so recht dahinter.
Ich versuche ein Bild zeichnen zu lassen, dass ich vorher in ein int-Array gespeichert habe.
Breite und Höhe sind auch bekannt.
Die RGB-Werte sind entsprechend gespeichert, also x[0] = rot-Wert, x[1] = grün, x[2] = blau usw.

Wenn ich es so versuche wie bis jetzt, dann bekomme ich nen schwarzen Kasten raus und nicht
das schöne rote auto, dass das Bild zeigt :)

Hier mal der Code:

Code:
import java.awt.BorderLayout;
import java.awt.Color;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.WindowConstants;

public class PicViewer extends JFrame{
	public PicViewer () {

		this.setTitle("PicViewer");
		this.setSize(300, 200);
		this.setResizable(false);
		this.setBackground(new Color(100,100,100));
		this.setLocation(100, 50);
		this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		
		// content
		JPanel panel = new JPanel(new BorderLayout());
		
		this.add(panel);
		this.setVisible(true);
	}
	
	public void draw(int[] pixels, int width, int height) {
		 
		int widthm3 = width*3;  
         for (int i = 0; i < pixels.length; i+=3) {
        	 int r = pixels[i];
        	 int g = pixels[i+1];
        	 int b = pixels[i+2];
        	 	Color z = new Color(r, b, g);
                        this.getGraphics().setColor(z);  
                        this.getGraphics().drawLine((i%widthm3)/3, i/widthm3, (i%widthm3)/3, i/widthm3);  
         }
        
	}

}

Hat jemand nen vorschlag?
Oder einfach nur tipps wie man´s schöner machen könnte?

Prämisse ist aber, dass ich das Bild aus dem Int-Array lesen muss...

Vielen Dank schon mal,

MfG
Roland
 

Quaxli

Top Contributor
Mal davon abgesehen, das mir die Funktionsweise der draw-Methode irgendwie nicht klar ist, folgende Anmerkungen:

- die draw-Methode wird nirgends aufgerufen
- damit etwas angezeigt wird, mußt Du nach dem Zeichnen einen repaint() machen
- getGraphics()... tutet man nicht - nie! (also fast nie, bevor wieder jemand weint.. ;)).

Nimm eine eigene Komponente, die von JPanel erbt und überschreibe die paintComponent-Methode. Dort packst Du dann rein, was Du jetzt in der draw-Methode hast (ohne den getGraphics()-Schlonz, da paintComponent() ein GrafikObjekt übergben bekommt).
Diese eigene Komponente addest Du dann anstelle des JPanel in Dein JFrame und dann solltest Du auch was angezeigt bekommen.
 

Roland

Mitglied
Danke für den Tipp.

Werds mal so probieren.

Die draw-Methode wird von nem Controller aufgerufen. Ich gebe zu, hätt ich erwähnen sollen :)

drawLine() zeichnet ne Linie, in dem Fall halt nur eine die 1en Pixel lang ist. Hab keinen besseren Weg
gefunden einzelne Pixel zu zeichnen.
 

Marco13

Top Contributor
In diesem Fall wäre es vmtl. besser (d.h. DEUTLICH effizienter) den Array nur EIN mal in ein BufferedImage reinzumalen, und in der paintComponent dann nurnoch das BufferedImage zu malen.

In einem BufferedImage kann man die Pixel direkt setzen, und braucht nicht drawLine zu machen.

Code:
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

public void updateImage(array...)
{
    for (x...)
    {
        for (y...)
        {
            int r = array[x,y,0];
            int g = array[x,y,1];
            int b = array[x,y,2];
            int rgb = (r<<16) | (g<<8) | b;
            image.setRGB(x,y, rgb);
        }
    }
}

...

public void paintComponent(Graphics g)
{
    g.drawImage(image,0,0,this);
}
 

Quaxli

Top Contributor
In Bezug auf die einzelnen Pixel hätte ich folgenden Vorschlag:

- erstelle Dir im Konstruktor ein BufferedImage in der Größe der Komponent/Zeichnung
- diese BufferedImage zeichnest Du in der paintComponent-Methode mit drawImage(...)
- Deine eigentliche Zeichenarbeit machst Du vorher in diesey BufferedImage
- in diesem BufferedImage kannst Du mit setRGB(int x, int y, int rgb) einzelnen Pixel einfärben
- den Integer rgb bekommt man z. B. über eine Color-Objekt mit getRGB()
 
G

Guest

Gast
Kannst du mir erklären, was das hier macht?

Code:
            int r = array[x,y,0];
            int g = array[x,y,1];
            int b = array[x,y,2];
            int rgb = (r<<16) | (g<<8) | b;
 

Quaxli

Top Contributor
Ohne zu Wissen, was jetzt x und y an der Ecke sind, wird hier offensichtlich über Bit-Verschiebung ein integer in der Form zusammen gebaut, wie Du ihn in der 3. Variable der Methode setRGB(...) benötigst.

Im Prinzip könnte man z.B. auch schreiben:

Color c = new Color(r,g,b);
c.getRGB();
 

Marco13

Top Contributor
Anonymous hat gesagt.:
Kannst du mir erklären, was das hier macht?
...

Vielleicht sollte ich erwähnen, dass

int r = array[x,y,0];

Pseudocode ist, und so viel bedeuten soll wie: "r ist die Rot-Komponente des Pixels an der Position x,y". (Wie genau das in deinem Array abgespeichert ist, hatte ich nicht nachvollzogen). Man kann sich das RGB auch so holen, wie Quaxli es beschrieben hat, aber das ist u.U. deutlich langsamer (weil jedes mal ein neues Color-Objekt erstellt wird, was eigentlich überflüssig ist)

Das
int rgb = (r<<16) | (g<<8) | b;
kombiniert die Rot- Grün und Blau-Anteile eines Pixels in EINEN int, so dass man diesen Pixel direkt im BufferedImage mit der gewünschten RGB-Farbe setzen kann.
 
G

Guest

Gast
Danke für die Erklärungen und die Hilfe :)

Schon wieder was gelernt.

So funktionierts jetzt:

Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;

import javax.swing.JPanel;

public class PicPanel extends JPanel{
	BufferedImage bufPic;
	int[] panPixels;
	int panWidth;
	int panHeight;
	
	public PicPanel(int[] pixels, int width, int height) {
		super();
		panPixels = new int[pixels.length];
		panPixels = pixels;
		panWidth = width;
		panHeight = height;
		bufPic = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		
		this.updateImage(panPixels, panWidth, panHeight);
	}
	
	public void updateImage(int[] panPixels, int panWidth, int panHeight)
	{
		int widthm3 = panWidth*3;  
        for (int i = 0; i < panPixels.length; i+=3) {
       	 int r = panPixels[i];
       	 int g = panPixels[i+1];
       	 int b = panPixels[i+2];

       	 int rgb = (r<<16) | (g<<8) | b;                 
            bufPic.setRGB((i%widthm3)/3, i/widthm3, rgb);  
        }       
		
	} 
	
	// called when painted
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		g.drawImage(bufPic,0,0,this);
	}
}

Grüße
Roland
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
U Pixel zeichnen AWT, Swing, JavaFX & SWT 2
C AWT: Pixel für Pixel Linien auf Panel zeichnen AWT, Swing, JavaFX & SWT 2
H Pixel zeichnen AWT, Swing, JavaFX & SWT 6
TheSepp Fenster um x Pixel bewegen, wenn man auf dem Knopf drückt AWT, Swing, JavaFX & SWT 10
C Pixel-Rendering/Animation Performance in BufferedImage AWT, Swing, JavaFX & SWT 1
N Swing GridBagLayout: Ein Pixel Versatz AWT, Swing, JavaFX & SWT 2
D Swing Farbe aus Pixel vom JFrame auslesen AWT, Swing, JavaFX & SWT 17
M Wie ermittele ich die Breite und Höhe meines Displays in Pixel AWT, Swing, JavaFX & SWT 3
TheWhiteShadow Swing Document Text Position in Pixel AWT, Swing, JavaFX & SWT 2
S Pixel im *.Gif ändern AWT, Swing, JavaFX & SWT 2
D Pixel in ein Array einlesen AWT, Swing, JavaFX & SWT 2
H Einzelne Pixel auf Transparenz überprüfen? AWT, Swing, JavaFX & SWT 3
F png-Datei erstellen und einzelne Pixel schreiben AWT, Swing, JavaFX & SWT 2
I JScrollPane, wenn JLabels x Pixel erreichen AWT, Swing, JavaFX & SWT 3
K Fontgröße in Pixel angeben AWT, Swing, JavaFX & SWT 5
G Pixel ablaufartig verändern AWT, Swing, JavaFX & SWT 5
D Wie viele Pixel welches Icon? AWT, Swing, JavaFX & SWT 4
B Bild(pixel) füllen AWT, Swing, JavaFX & SWT 6
N Alle Pixel-Koordinaten von z.B. g.drawLine(.) speichern AWT, Swing, JavaFX & SWT 7
B Länge eines Strings in Pixel AWT, Swing, JavaFX & SWT 2
G Buggeredimage & pixel HUE/RGB AWT, Swing, JavaFX & SWT 17
D Zeichen ein Pixel mit Java2D AWT, Swing, JavaFX & SWT 15
T Pixel OS abhängig AWT, Swing, JavaFX & SWT 3
T jedes Pixel aus dem Image (auf dem Panel) auslesen AWT, Swing, JavaFX & SWT 3
N Laenge eines Strings in Pixel AWT, Swing, JavaFX & SWT 2
M Farbe eines Pixel im Image ändern AWT, Swing, JavaFX & SWT 1
Luma Bild Pixel für Pixel auslesen? AWT, Swing, JavaFX & SWT 3
F Pixel Farbe auslesen AWT, Swing, JavaFX & SWT 3
C Image-Pixel manipulieren AWT, Swing, JavaFX & SWT 9
T Pixel nach Farbwert abfragen AWT, Swing, JavaFX & SWT 2
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
H JavaFX Canvas neu zeichnen anstoßen AWT, Swing, JavaFX & SWT 34
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
S Event Handling Neu zeichnen nur wenn Berechnung fertig ist AWT, Swing, JavaFX & SWT 4
W JavaFX Ich kann keinen Kreis richtig zeichnen AWT, Swing, JavaFX & SWT 8
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
G Dreieck aus Pixeln zeichnen AWT, Swing, JavaFX & SWT 8
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
Z Swing Graph zeichnen lassen AWT, Swing, JavaFX & SWT 16
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4
L Swing zeichnen AWT, Swing, JavaFX & SWT 14
S GUI Kreuz zeichnen und Position ausgeben AWT, Swing, JavaFX & SWT 3
S GUI Kreis zeichnen AWT, Swing, JavaFX & SWT 13
S Swing Rechteck über JTable zeichnen (per MouseListener) AWT, Swing, JavaFX & SWT 1
L Swing Ein Rechteck in ein Grid Zeichnen AWT, Swing, JavaFX & SWT 5
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
K Mehrere Linien zeichnen AWT, Swing, JavaFX & SWT 8
E Transparent zeichnen AWT, Swing, JavaFX & SWT 2
S AWT Probleme beim Zeichnen AWT, Swing, JavaFX & SWT 3
T Tic Tac Toe - GUI Linien zeichnen AWT, Swing, JavaFX & SWT 14
C Applet Zeichnen über Button-Click AWT, Swing, JavaFX & SWT 13
Soloeco Graph zeichnen AWT, Swing, JavaFX & SWT 1
G Zeichnen Programm AWT, Swing, JavaFX & SWT 1
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
D Quadrat, Rechteck zeichnen AWT, Swing, JavaFX & SWT 3
K Probleme beim zeichnen mit paintComponent() AWT, Swing, JavaFX & SWT 1
JG12111989 mehrere Polyline-Objekte zeichnen AWT, Swing, JavaFX & SWT 3
A Swing JRadioButton zeichnen nicht AWT, Swing, JavaFX & SWT 4
J Swing Vertikales Zeichnen eines Strings mit Java2D AWT, Swing, JavaFX & SWT 1
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
P 2D-Grafik Bogen(Arc) zwischen zwei Punkten zeichnen AWT, Swing, JavaFX & SWT 2
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
KilledByCheese Swing 2D JLabel Array Maze zeichnen AWT, Swing, JavaFX & SWT 2
S Parallele Linien zeichnen AWT, Swing, JavaFX & SWT 5
J Linien auf JPanel zeichnen AWT, Swing, JavaFX & SWT 3
P AWT Canvas freihändig zeichnen AWT, Swing, JavaFX & SWT 1
llabusch Linien in JPanel zeichnen AWT, Swing, JavaFX & SWT 6
S passende PaintComponent ? Zeichnen in TextArea mit Scrollpane ? AWT, Swing, JavaFX & SWT 2
I Applet BlueJ Applet - Bild mit if-Schleife zeichnen lassen AWT, Swing, JavaFX & SWT 16
L JavaFX JavafX Timelime zeichnen und schön stylen? AWT, Swing, JavaFX & SWT 2
I JFrame neu zeichnen, nicht überzeichnen! AWT, Swing, JavaFX & SWT 2
I Spielsteine zeichnen und entfernen AWT, Swing, JavaFX & SWT 3
H JavaFX Freezes beim Zeichnen mit Canvas AWT, Swing, JavaFX & SWT 3
H Swing BufferedImage zeichnen AWT, Swing, JavaFX & SWT 1
M JFreeChart neu zeichnen sich Wenn Jtable sich ändert AWT, Swing, JavaFX & SWT 5
S 2D-Grafik MouseDragged Linien zeichnen AWT, Swing, JavaFX & SWT 4
M Zeichnen ohne vorherige Linien zu löschen AWT, Swing, JavaFX & SWT 2
T Problem beim Zeichnen von Rechteck AWT, Swing, JavaFX & SWT 3
T Swing / Kreis zeichnen AWT, Swing, JavaFX & SWT 2
I Text zur Linie zeichnen AWT, Swing, JavaFX & SWT 1
I Pfeil zeichnen am Ende einer Linie AWT, Swing, JavaFX & SWT 1
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
F Zeichnen des Button AWT, Swing, JavaFX & SWT 4
B Zeichnen mit paintComponent? Oder anders? AWT, Swing, JavaFX & SWT 15
C Swing Aus verschiedenen Klassen zeichnen. AWT, Swing, JavaFX & SWT 2
C Swing BufferedImage zeichnen und JLabels setzen. AWT, Swing, JavaFX & SWT 17
M Kein Zeichnen der Figuren auf JPanel AWT, Swing, JavaFX & SWT 4
J JButton neu zeichnen lassen AWT, Swing, JavaFX & SWT 9
S Quadrat auf Frame zeichnen AWT, Swing, JavaFX & SWT 2
P Image oder Icon auf Tooltip zeichnen AWT, Swing, JavaFX & SWT 4
C Graphics Objekt in Zeitschleife zeichnen AWT, Swing, JavaFX & SWT 4
X Swing JPanel mehrere Ebenen zeichnen AWT, Swing, JavaFX & SWT 13
G Zeichnen auf eine schwergewichtige Komponente? AWT, Swing, JavaFX & SWT 0
G Mehrere Strings um Kreis zeichnen und positionieren AWT, Swing, JavaFX & SWT 0
P SWT Nebula Gallery - Bildbereiche zeichnen AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen


Oben