In ein bestehendes Bild zeichnen

Die zwei beiliegenden Klassen zeichnen mir zwei Ovale. Kann mir jemand Quellcode so einfügen, dass ich sehe, wie diese beiden Ovale auch auf einer bestehenden jpg- oder png-Datei dargestellt werden können ?

Vielen Dank im voraus,
mit freundlichen Grüßen,

Arndt Weber

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

/** Spezielle JPanel-Klasse */
public class ZeichenPanel extends JPanel {
public void paintComponent(Graphics g) {
g.drawOval(110,60,30,15);
g.fillOval(60,130,30,30);

}
}
/________________________________________________________
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/** Erzeuge ein Swing-Fenster mit einer Zeichnung */
public class Zeichnung extends JFrame {
Container c; // Container dieses Frames
ZeichenPanel z; // Zeichnung auf dem Zeichen-Panel

public Zeichnung() { // Konstruktor
c = getContentPane();
// Erzeuge neue Zeichnung und fuege sie dem Frame hinzu
z = new ZeichenPanel();
c.add(z);
}

public static void main(String[] args) { // main-Methode
Zeichnung fenster = new Zeichnung();
fenster.setTitle(„Zeichnung“);
fenster.setSize(200,200);
fenster.setVisible(true);
fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

Moin

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

import java.imageio.*;

public class ZeichenPanel extends JPanel {
public void paintComponent(Graphics g) {

Eigentlich muss an dieser Stelle ZUERST das Bild und dann die 2 Ovale gezeichnet werden. An das Bild kommt man per:

BufferedImage I = ImageIO.read (new File (…deine jpg/gif/png datei …))

Zeichnen des Bildes:
g.drawImage (I,… );

g.drawOval(110,60,30,15);
g.fillOval(60,130,30,30);
}
}

Alternativ kann man die 2 Ovale auf das Bild zeichenen und dann alles zusammen auf den Schirm:

Graphics g = I.getGraphics();
g.drawOval(110,60,30,15);
g.fillOval(60,130,30,30);

Ab da hat das Bild die 2 Ovale schon mit drin. Das Bild zeichnet man wie oben (und man lässt die Ovale weg)

cu

Hallo die Herren.

Objektiv gesehen hat punpkin recht. Sinnigerweise hatte ich den Code auch mal auf Suse Linux 9.0 & JDK 1.4 & Standardgrafikkarte getestet. Das Ergebnis innerhalb des Fensters war jedenfalls kaum eine Augenweide (im Ggs. zur Darstellung unter XP+SP1 & JRE 1.4 & richtigen GraKa Treibern). Von daher ist Vorsicht anzuraten… Oder da spielt jemand „Wer sieht was ?“

HTH
mfg M.L.

***Werbung***
http://www.developer.com/

Vielen Dank Pumpkin,

allerdings habe ich noch ein Problem mit folgender Zeile:

BufferedImage I = ImageIO.read (new File (…deine jpg/gif/pngdatei …))

Wenn meine Datei 110.jpg heißt, dann gibt’s eine Fehlermeldung mit

BufferedImage I = ImageIO.read (new File („110.jpg“));

Was mache ich falsch ?

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Moin

Wenn meine Datei 110.jpg heißt, dann gibt’s eine Fehlermeldung
mit

Welche Meldung ist es den ? FileNotFound ? Dann musst du den Dateinamen komplett angeben, also „c:\meine dateien\meine bilder\110.jpg“.

cu

Moin

Das Ergebnis innerhalb des
Fensters war jedenfalls kaum eine Augenweide (im Ggs. zur
Darstellung unter XP+SP1 & JRE 1.4 & richtigen GraKa
Treibern). Von daher ist Vorsicht anzuraten… Oder da spielt
jemand „Wer sieht was ?“

Die java.awt-API eh nicht gerade bekannt für besonders schöne Ergebnisse. Kanns aber mal mit den Parametern von java.awt.Graphics spielen. Da gibt’s irgendwo auch SoftwareAA (was unter windows glaub ich automatisch immer eingeschaltet ist … ?)

cu

Leider gibt’s nur die Fehlermeldung „cannot resolve symbol“.
Kannst Du mir nicht irgendwoher ein Beispiel kopieren oder mir sagen wo ich ein solches finde, in dem ein bestehendes Bild angezeigt wird und dort anhand einer XY-Koordinate eine Markierung eingefügt wird ?
Ich versuch’s jetzt schon seit vielen Tagen und schaffe das einfach nicht.

Gruß,
Arndt

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Moin

Leider gibt’s nur die Fehlermeldung „cannot resolve symbol“.

Das ist eine Compilerfehlermeldung. D.h. im Klartext: der weiss nicht welche Klasse du da gerade verwenden willst. D.h. es fehlt ein import, so in der Art:

import javax.swing.*;
import java.imagio.*;

Kannst Du mir nicht irgendwoher ein Beispiel kopieren oder mir
sagen wo ich ein solches finde, in dem ein bestehendes Bild
angezeigt wird und dort anhand einer XY-Koordinate eine
Markierung eingefügt wird ?

Dafür gibt’s ein AWT-Tutorial und ein swing-tutorial: http://java.sun.com/docs/books/tutorial/uiswing/14pa…

Ich versuch’s jetzt schon seit vielen Tagen und schaffe das
einfach nicht.

Du hast kein Problem mit dem Zeichen, du hast ein Problem mit dem Kompilieren. Sieh dir nochmal genau an wie import funktioniert.

cu

Hallo !

Eigentlich hatte ich doch aber mit „import“ alle Packages geladen. Wie dem auch sei, ich habe anbei zwei Klassen, die sich auch kompilieren lassen und die auf einem Bild (110.jpg) zwei Ellipsen zeichnen sollen.
Die Klassen werden richtig kompliert, das Bild wird auch richtig dargestellt, allerdings die Ellipsen nicht eingezeichnet. Kannst Du mir sagen, warum nicht ? Anbei die beiden Klassen:

// 1.Klasse _______________________________________________________
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

/** Erzeuge ein einfaches Swing-Fenster mit einem Label */
public class FrameMitBild2 extends JFrame {
Container c; // Container dieses Frames
JLabel lab; // Label das im Frame erscheinen soll
ZeichenPanel z; // Elipsen auf dem Bild

// Konstruktor fuer unseren Frame mit Textlabel
public FrameMitBild2() {
c = getContentPane(); // Container bestimmen
c.setLayout(new FlowLayout()); // Layout setzen
z = new ZeichenPanel();
// Bildobjekt erzeugen
Icon bild = new ImageIcon(„110.jpg“);
// Label mit Text und Bild beschriften
lab = new JLabel(„Bild“, bild, JLabel.CENTER);
// Text unter das Bild setzen
lab.setHorizontalTextPosition(JLabel.CENTER);
lab.setVerticalTextPosition(JLabel.BOTTOM);
// Fuege das Label und die Zeichnung dem Frame hinzu
c.add(lab);
c.add(z);
}

public static void main(String[] args) {
FrameMitBild2 fenster = new FrameMitBild2();
fenster.setSize(700,600);
fenster.setVisible(true);
fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

//2.Klasse ______________________________________________________
import javax.swing.*;
import java.awt.*;

/** Spezielle JPanel-Klasse */
public class ZeichenPanel extends JPanel {
public void paintComponent(Graphics g) {
// Zeichnet zwei Ovale
g.drawOval(110,60,30,15);
g.fillOval(60,130,30,30);
}
}

Gruß und vielen Dank im voraus,

Arndt Weber

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]