Malen auf Buffered Image

Status
Nicht offen für weitere Antworten.

ulr!ch

Bekanntes Mitglied
Hi JavaGemeinde,

habe hier ein Riesenproblem, über das ich bereits die halbe Nacht nachgedacht habe. :(
Jedoch leider ohne nennenswertes Resultat.
Ich habe (mittels einer funktionierenden Klasse aus dem Internet) einen gif-File in ein BufferedImage eingelesen. Dieses "bimage" draw ich dann. Auf dem bimage möchte ich gerne irgendetwas zeichnen, was aber leider nicht funktioniert. :( Vielleicht wird die Linie vom Bild überzeichnet, ich habe keine Ahnung. So sieht der Code grob aus.
Code:
public class Zeichnen
    extends JLabel  {
  Image image;
  BufferedImage bimage;
  
  public Zeichnen() {
    setPreferredSize(new Dimension(500, 500));
    repaint();
  }

  public void paintComponent(Graphics g) {
// bimage zeichnen, das funktioniert auch, Bild wird angezeigt
    Graphics2D matrix = (Graphics2D) g;
    image = Toolkit.getDefaultToolkit().getImage("images/matrix1.gif");
    bimage = toBufferedImage(image);
    matrix.drawImage(bimage, null, 0, 0);

// einfache Linie zwichnen
    Graphics2D Linie = bimage.createGraphics();
    Linie.setColor(Color.blue);
    Linie.drawLine(0,0,100, 100);
  }
}
Ich kann nicht einfach ein ImageIcon oder Image nehmen, weil ich später mit der PixelGrabber-Klasse den Farbwert eines Pixels ergattern möchte. Dabei ist allerdings diese unlösbare (?) Problem aufgetreten...
Für Hilfe bin ich echt dankbar.

By<e Ulrich
 

ulr!ch

Bekanntes Mitglied
Hi JavaGemeinde,

habe mittlerweile gemerkt, dass, wenn ich den drawImage-Befehl hinter die blaue Linie-Anweisung schreibe, diese gezeichnet wird. Aber wie kann ich das Bild updaten, da später mal alles auf Mauszeigereingaben reagieren soll.
super.repaint(); oder repaint(); habe ich bereits ausprobiert und es funktioniert nicht. :(

By<e Ulrich
 

ulr!ch

Bekanntes Mitglied
Hi JavaGemeinde,

ich bin's noch einmal, habe den Code verändert und wollte nun noch einmal das Update posten:
Code:
public class Zeichnen
    extends JLabel implements MouseListener {
  int i=1;
  int[] plX = new int[1000];
  int[] plY = new int[1000];

  boolean released;
  Image image;
  BufferedImage bimage;
  
  public Zeichnen() {
    setPreferredSize(new Dimension(500, 500));
    addMouseListener(this);
    repaint();
  }

  public void paintComponent(Graphics g) {

    Graphics2D matrix = (Graphics2D) g;
    image = Toolkit.getDefaultToolkit().getImage("images/matrix1.gif");
    bimage = toBufferedImage(image);

// Linienzug
    if (released) {
      Graphics2D Linie = bimage.createGraphics();
      Linie.drawPolyline(plX, plY, i);
    }
    matrix.drawImage(bimage, null, 0, 0);
  }

  public void mouseMoved(MouseEvent e) {}
  public void mouseDragged(MouseEvent e) {}
  public void mousePressed(MouseEvent e) {}
  public void mouseReleased(MouseEvent e) {
    released = true;
    plX[i] = e.getX();
    plY[i] = e.getY();
  }
  public void mouseClicked(MouseEvent e){}
  public void mouseEntered(MouseEvent e) {}
  public void mouseExited(MouseEvent e) {}
}

Und nun kann ich leider keinen Linienzug, durch Anklicken verschiedener Punkte auf dem bimage, zeichnen. Als ich noch ein Image verwendet habe, funktionierte alles. Wo liegt der Fehler?
Wo muss wie ich die Graphic updaten?

Please help! :bahnhof:
By<e Ulrich
 
B

Beni

Gast
Also, was du genau willst, weiss ich nicht. Aber wie man Linien auf einem Bild zeichnet, kann ich dir sagen :)

So (Maus drücken, mit gedrückter Taste Maus bewegen, dann loslassen; gibt eine blaue Linie):
Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;

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

public class Zeichnen extends JPanel {
    private BufferedImage bimage;
    private int x, y;
    
    public Zeichnen() {
        setPreferredSize(new Dimension(500, 500));
        bimage = new BufferedImage( 500, 500, BufferedImage.TYPE_INT_RGB );
        
        addMouseListener( new MouseAdapter(){
            @Override
            public void mousePressed( MouseEvent e ) {
                x = e.getX();
                y = e.getY();
            }
            @Override
            public void mouseReleased( MouseEvent e ) {
                Graphics g = bimage.getGraphics();
                g.setColor( Color.BLUE );
                g.drawLine( x, y, e.getX(), e.getY() );
                repaint();
            }
        });
    }

    public void paintComponent( Graphics g ) {
        g.drawImage( bimage, 0, 0, this );
    }
    
    // nur zum testen
    // -------------------------------------------
    public static void main( String[] args ) {
        JFrame frame = new JFrame();
        frame.add( new Zeichnen() );
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }
}

Der wichtige Unterschied: ich lade nicht jedesmal ein neues Bild, wenn ich zeichne (bei deinem Code wird bei jedem Aufruf von paintComponent ein Bild geladen, und das alte damit überschrieben. P.S. und sehr performant ist es nicht, alle paar Millisekunden ein Bild von der HD zu lesen...)
 

ulr!ch

Bekanntes Mitglied
:applaus: Danke Ben,
Klappt super! :)

Nur eine kleine Frage habe ich noch: Den ganzen Aufwand mit dem BufferedImage hatte ich ja nur betrieben, um mir die RGB-Werte bei einem bestimmten Pixel (Maus-Cursor-Position) ausgeben lassen zu können.
Wenn ich allerdings die Zeile:
Code:
	System.out.println(bimage.getRGB(e.getX(), e.getY()));
einfüge, dann gibt er mir immer den Wert -16776961 raus, egal wohin ich klicke, obwohl eigentlich unterschiedliche Farbwerte zurückgeliefert werden sollten.
Hast du vielleicht eine Ahnung, woran das liegen könnte.
Wäre dir sehr dankbar.

Ciao,
Ulrich
 
B

Beni

Gast
Also der Wert -16776961 hört sich irgendwie nach weiss an.

Bist du sicher, dass du das richtige Bild erwischt hast (ich weiss ja nicht, wie dein neuer Code aussieht)? Lässt du bimage zeichnen (und wird was sinnvolles gezeichnet)?
 

ulr!ch

Bekanntes Mitglied
Beni hat gesagt.:
Also der Wert -16776961 hört sich irgendwie nach weiss an.

Bist du sicher, dass du das richtige Bild erwischt hast (ich weiss ja nicht, wie dein neuer Code aussieht)? Lässt du bimage zeichnen (und wird was sinnvolles gezeichnet)?
Ja, an weiss oder schwarz hatte ich auch gedacht.
Also das Bild wird nun angezeigt und ich kann auch darauf zeichnen.
Der Code sieht nun wie folgt aus:
Code:
public class Zeichnen
  extends JLabel {
  int i=1;
  int[] plX = new int[1000];
  int[] plY = new int[1000];

  Image image;
  BufferedImage bimage;
  
  public Zeichnen() {
    setPreferredSize(new Dimension(500, 500));
    image = Toolkit.getDefaultToolkit().getImage("images/matrix1.gif");
    bimage = toBufferedImage(image);
 
    addMouseListener( new MouseAdapter(){
      public void mouseMoved(MouseEvent e) {}
      public void mouseDragged(MouseEvent e) {}
      public void mousePressed(MouseEvent e) {}
      public void mouseReleased(MouseEvent e) {
// Startpunkt
	plX[0] = 90;
	plY[0] = 100;
	plX[i] = e.getX();
	plY[i] = e.getY();
	i++;

// Linie
	Graphics g = bimage.getGraphics(); 
	Graphics2D linie = (Graphics2D) g;
	linie.setColor(Color.blue);
	BasicStroke thick = new BasicStroke (3f);
	linie.setStroke(thick);
	linie.drawPolyline(plX, plY, i);

	repaint();
	System.out.println(bimage.getRGB(e.getX(), e.getY()));
      }
    
      public void mouseClicked(MouseEvent e){}
      public void mouseEntered(MouseEvent e) {}
      public void mouseExited(MouseEvent e) {}
    });
  }

  public void paintComponent(Graphics g) {
    g.drawImage(bimage, 0, 0, this);
  }
}
Hast du eine Ahnung, woran das liegen kann?
Wäre echt super! :)

Ciao,
Ulrich
 
B

Beni

Gast
Hm, zuerst zeichnest du, danach fragst du die Farbe ab. Da ist die Farbe natürlich das, was du vorhin gezeichnet hast :wink:
Einfach die Abfrage vor dem "g.draw..." machen.
 

ulr!ch

Bekanntes Mitglied
Beni hat gesagt.:
Hm, zuerst zeichnest du, danach fragst du die Farbe ab. Da ist die Farbe natürlich das, was du vorhin gezeichnet hast :wink:
Einfach die Abfrage vor dem "g.draw..." machen.
Hm, das soll ja auch so sein, weil ich die Farbbestimmung abhängig von der aktuellen Cursor-Position machen möchte. Der Sinn, der dahintersteckt, ist so etwas wie eine verweissensitive Graphik: Die Linie soll nur von bestimmten Punkten zu anderen gezogen werden. Deswegen soll der Farbwert des releasedCursorPosition abgefragt werden, wenn dann gleich Color X, soll die Linie gezeichnet werden.
Ich glaube, irgendwas habe ich da noch nicht ganz verstanden: Wieso funktioniert deine Eingabe, die ich einfach mal ausprobiert habe, obwohl die Graphik noch nicht gezeichnet wurde?
Und wieso funktioniert es andersherum nicht?
Komme ich vielleicht mit der Grabber-Klasse weiter?
Code:
PixelGrabber pg = new PixelGrabber(bimage, e.getX(), e.getY(), 1, 1, false);
	try {
	  pg.grabPixels();
	  ColorModel cm = pg.getColorModel();
//	  cm.getRGB(pg);
	}
	catch (InterruptedException egb) {}
Fliege dabei aber mit einer NullpointerException raus. :(

Bitte um Hinweise. Thx, Beni!

By<e Ulrich
 

ulr!ch

Bekanntes Mitglied
OK, Beni,

danke für die ganze Hilfe.
Jetzt scheint es zu funktionieren.
Nun muss ich nur noch die Ganzzahlen in RGB-Farben umkodieren, aber das bekomme ich jetzt auch noch hin.
Danke noch einmal für die Hilfe. :)

By<e Ulrich
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Schnelleres Malen AWT, Swing, JavaFX & SWT 22
E Auf JPanel malen und davor JComponenten anzeigen AWT, Swing, JavaFX & SWT 12
Java_RY Bin Ratlos bzgl Malen in Swing AWT, Swing, JavaFX & SWT 5
M Punkte malen AWT, Swing, JavaFX & SWT 1
M Schrift "malen" AWT, Swing, JavaFX & SWT 11
Regedit JavaFX Java Canvas hört ständig auf zu aktualisieren/malen AWT, Swing, JavaFX & SWT 3
Z Auf ein JLabel drauf malen? AWT, Swing, JavaFX & SWT 1
J Swing Bild laden, Kreise drin malen, Schreiben AWT, Swing, JavaFX & SWT 2
L Gradient Hintergrund malen und durchscheinen lassen AWT, Swing, JavaFX & SWT 8
windl Querstreifen beim Bilder malen und anpassen an neue CPU AWT, Swing, JavaFX & SWT 12
S JButton in JLabel malen AWT, Swing, JavaFX & SWT 7
E JButton Text malen AWT, Swing, JavaFX & SWT 3
J Swing Malen auf JPanel mit transparentem Hintergrund AWT, Swing, JavaFX & SWT 21
B 2D-Grafik Malen/übermalen mit Canvas AWT, Swing, JavaFX & SWT 5
K swing/awt Panel punkte malen AWT, Swing, JavaFX & SWT 4
G Auf Image malen AWT, Swing, JavaFX & SWT 12
B Wie Panel neu Laden/Malen/Aktualisieren AWT, Swing, JavaFX & SWT 14
G kreis malen -> welche funktion? AWT, Swing, JavaFX & SWT 3
V Framework zum Zeichnen/Malen? AWT, Swing, JavaFX & SWT 7
D bei Thread in JComponent malen NullPointerException AWT, Swing, JavaFX & SWT 3
J Einmal gleichzeitig auf zwei Graphics malen? AWT, Swing, JavaFX & SWT 5
C ".tif" Image in Java einbinden und malen lassen AWT, Swing, JavaFX & SWT 7
H auf einem Bild malen AWT, Swing, JavaFX & SWT 4
N malen => 1 Sekunde warten => malen AWT, Swing, JavaFX & SWT 2
V Punkte malen im Panel AWT, Swing, JavaFX & SWT 3
V Auf Knopfdruck malen ?????? AWT, Swing, JavaFX & SWT 5
T Swing Buffered Image anzeigen AWT, Swing, JavaFX & SWT 45
L Swing Component in Buffered Image AWT, Swing, JavaFX & SWT 6
D YCbCr Buffered Image, Y-, Cb-, Cr-Komponenten auslesen! AWT, Swing, JavaFX & SWT 2
C Buffered JTable AWT, Swing, JavaFX & SWT 4
XWing Swing Image anzeigen und probleme mit klassen AWT, Swing, JavaFX & SWT 3
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
K JavaFX Bildergalerie aus Image Ordner laden AWT, Swing, JavaFX & SWT 3
JMölleri Swing Image wird unscharf dargestellt AWT, Swing, JavaFX & SWT 2
L AWT .gif image transparent machen AWT, Swing, JavaFX & SWT 3
kodela angezeigtes Image entfernen AWT, Swing, JavaFX & SWT 1
R Java, GUI, Hintergrundbild, Image, AWT, Swing, JavaFX & SWT 4
R Swing Background Image in JFrame implementieren AWT, Swing, JavaFX & SWT 40
L Image kann nicht gefunden werden AWT, Swing, JavaFX & SWT 1
S Stretch Image in ImageView AWT, Swing, JavaFX & SWT 4
N Swing Image aus Web laden und in Icon umwandeln AWT, Swing, JavaFX & SWT 4
Fiedlerdan Image-Pfad Probleme nach Export aus Eclipse AWT, Swing, JavaFX & SWT 31
L JavaFX Image mit Blureffect AWT, Swing, JavaFX & SWT 2
Bluedaishi JavaFX Button Image aus Datenbank AWT, Swing, JavaFX & SWT 13
F javaxt.io.Image getBufferedImage liefert null AWT, Swing, JavaFX & SWT 1
Yjuq JavaFX Custom Control - Image resize AWT, Swing, JavaFX & SWT 0
D Java FX Image in einer Webanwendung annotieren und den Bereich ausschneiden AWT, Swing, JavaFX & SWT 0
I Bild über FXML (ImageView, Image) anzeigen AWT, Swing, JavaFX & SWT 1
T Image Loader lädt Bild nicht AWT, Swing, JavaFX & SWT 10
J 2D-Grafik Background Image Klasse AWT, Swing, JavaFX & SWT 14
Q AWT TicTacToe Image auf Button hinzufügen AWT, Swing, JavaFX & SWT 5
BreakdownBob Swing JLabel verschwindet hinter Image AWT, Swing, JavaFX & SWT 2
L JavaFX leeres weißes Image - javafx.scene.image.Image AWT, Swing, JavaFX & SWT 2
L JavaFX Image im ImageView auf Scroll Listener reagieren AWT, Swing, JavaFX & SWT 5
Naxon89 JavaFX Image wird nicht korrekt geladen AWT, Swing, JavaFX & SWT 3
W Javafx - Image soll sich mit der Camera mitbewegen AWT, Swing, JavaFX & SWT 1
B Graphics to Image AWT, Swing, JavaFX & SWT 3
L Image in anderes kopieren AWT, Swing, JavaFX & SWT 0
T Swing Image wird nicht geladen AWT, Swing, JavaFX & SWT 1
S JavaFX Image Skalierung in Scrollpane, Scrollpane resized sich nicht AWT, Swing, JavaFX & SWT 5
I Image im PopupMenu vom SystemTray AWT, Swing, JavaFX & SWT 8
F JavaFX Position von Image angeben/verändern AWT, Swing, JavaFX & SWT 2
M JavaFX Image View Würfel berechnen AWT, Swing, JavaFX & SWT 3
L JButton mit Image AWT, Swing, JavaFX & SWT 5
F Swing Image einem Button hinzufügen AWT, Swing, JavaFX & SWT 5
B Resize von Image nach Resize von Button AWT, Swing, JavaFX & SWT 1
T Image aus "nicht-src-ordner" AWT, Swing, JavaFX & SWT 5
vodkaz (javafx) Image Problem AWT, Swing, JavaFX & SWT 2
C Image laden und Speichern - Image wird auf JPanel nicht angezeigt AWT, Swing, JavaFX & SWT 4
M Image in JTable einfügen AWT, Swing, JavaFX & SWT 9
M Image aus MS Access anzeigen lassen AWT, Swing, JavaFX & SWT 9
H Image im Array per Knopfdruck ändern AWT, Swing, JavaFX & SWT 6
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
P Image oder Icon auf Tooltip zeichnen AWT, Swing, JavaFX & SWT 4
G JavaFX Image vergrößern AWT, Swing, JavaFX & SWT 5
U Image mit Zeichenbereich rotieren AWT, Swing, JavaFX & SWT 3
P Speicherproblem SWT.Image in Nebula-Gallery AWT, Swing, JavaFX & SWT 3
L JavaFX: Bild in Image einlesen AWT, Swing, JavaFX & SWT 11
D Image soll langsam sichtbar werden AWT, Swing, JavaFX & SWT 4
D JLabel Image ausrichten AWT, Swing, JavaFX & SWT 2
Z Flackern trotz Offscreen Image / Doublebuffer, (+ Frage zu Pixelvergleich) AWT, Swing, JavaFX & SWT 25
bluerob Problem beim Image zeichnen via andere Klasse AWT, Swing, JavaFX & SWT 7
H Image Icon ersetzen AWT, Swing, JavaFX & SWT 8
I Image Button AWT, Swing, JavaFX & SWT 4
U IntBuffer zum Image konvertieren. AWT, Swing, JavaFX & SWT 9
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
T 2D-Grafik Slideshow (DoubleBuffering und Image transformieren/bewegen) AWT, Swing, JavaFX & SWT 6
K Swing Warum bleibt das Image immer gleich AWT, Swing, JavaFX & SWT 4
L Swing dynamisches Image-Panel in Layout einbinden AWT, Swing, JavaFX & SWT 10
R Image laden sehr langsam AWT, Swing, JavaFX & SWT 7
D Image.getScaledInstance() vs. Netzwerkverbindung??? AWT, Swing, JavaFX & SWT 2
reibi SWT Image viewer AWT, Swing, JavaFX & SWT 2
lumo SWT Image funktion auf ImageDaten AWT, Swing, JavaFX & SWT 9
A Applet .gif in applet Image nicht animiert angezeigt AWT, Swing, JavaFX & SWT 4
M Image wird nicht neugezeichnet nach dem Wechsel AWT, Swing, JavaFX & SWT 2
lumo SWT Image Pattern AWT, Swing, JavaFX & SWT 5
P Image mehrfach in ein BufferedImage zeichnen AWT, Swing, JavaFX & SWT 7
M Swing Image in JPanel als Componente AWT, Swing, JavaFX & SWT 2
P nicht sichtbares JPanel / JFrame als Image speichern AWT, Swing, JavaFX & SWT 3
T Image skaliert in Variable speichern AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben