Canvas Inhalt als Bild speichern!

Status
Nicht offen für weitere Antworten.
J

Javalus

Gast
Hallo!

Bin noch recht unerfahren was Java angeht, bin gerade aber dabei ein kleines Mal-Programm zu kreieren.
Klappt alles eigentlich wunderbar, auch habe ich eine Funktion zum Speichern des Bildes eingebaut.
Wenn ich den Canvas speichere, ist das Gemalte auf dem Bild aber leider nicht zu sehen, sondern nur der Hintergrund. Warum, das frage iech euch :).

Code:
Malen aufn Canvas so:

public void mouseClicked(MouseEvent e){
  int x=e.getX(); int y=e.getY();
  Graphics g = canvas.getGraphics();
  g.drawOval(x,y,20,20);

}



..........

public void Speichern_ActionPerformed(ActionEvent evt) {

       BufferedImage bufferedImage = new BufferedImage(canvas.getWidth(), canvas.getHeight(),BufferedImage.TYPE_INT_RGB);
       canvas.paint(bufferedImage.getGraphics());
       try {ImageIO.write(bufferedImage, "JPEG",new File("bild.jpg"));}
       catch (IOException e1) {e1.printStackTrace();}
       
  }
 

Ebenius

Top Contributor
Weil man eben nicht getGraphics() benutzt. Zeichne gleich in ein Image per Image.getGraphics(), rufe repaint() auf und überschreib die paint()-Methode des Canvas, um das Image dann darzustellen.

Grüße, Ebenius
 

Ebenius

Top Contributor
Nö. Genauer gesagt: Man benutzt Component.getGraphics() lieber nicht. Image.getGraphics() ist super. Meintest Du das?
 
J

Javalus

Gast
Aber wenn ich repaint() benutze, wird doch das ganze Applet neu geladen oder nicht?
 
J

Javalus

Gast
Ebenius hat gesagt.:
huh? Wo steht das?

Stehen tuts nirgends :D. Hab eher die Erfahrung damit gemacht, weil ichs wohl falsch benutzt habe. Blutiger Anfänger :(.
Ebenius ich verstehe nicht, was du mit Image.getGraphics meinst statt getGraphics. Könntest du das vielleicht anhand eines kleinen Beispiels verdeutlichen? Wäre sehr nett :)
 

Ebenius

Top Contributor
Ich hab mal als Beispiel einen Canvas gemacht. Den musst Du für die Variable "canvas" benutzen. Die Größe der Zeichenfläche kannst Du später ja noch ändern.
Code:
public class ZeichenCanvas extends Canvas {

  private final Image buffer =
        new BufferedImage(640, 480, BufferedImage.TYPE_INT_ARGB);

  @Override
  public void paint(Graphics g) {
    super.paint(g);
    g.drawImage(buffer, 0, 0, this);
  }

  public Image getOffscreenImage() {
    return buffer;
  }
}

Und jetzt änderst Du noch Deine MouseListener-Methode:
Code:
public void mouseClicked(MouseEvent e){ 
  int x=e.getX(); int y=e.getY(); 
  Graphics g = canvas.getOffscreenImage().getGraphics(); 
  g.drawOval(x,y,20,20);
  canvas.repaint();
}

Wird's so klarer?

Ebenius
 
J

Javalus

Gast
Ebenius hat gesagt.:
Ich hab mal als Beispiel einen Canvas gemacht. Den musst Du für die Variable "canvas" benutzen. Die Größe der Zeichenfläche kannst Du später ja noch ändern.
Code:
public class ZeichenCanvas extends Canvas {

  private final Image buffer =
        new BufferedImage(640, 480, BufferedImage.TYPE_INT_ARGB);

  @Override
  public void paint(Graphics g) {
    super.paint(g);
    g.drawImage(buffer, 0, 0, this);
  }

  public Image getOffscreenImage() {
    return buffer;
  }
}

Und jetzt änderst Du noch Deine MouseListener-Methode:
Code:
public void mouseClicked(MouseEvent e){ 
  int x=e.getX(); int y=e.getY(); 
  Graphics g = canvas.getOffscreenImage().getGraphics(); 
  g.drawOval(x,y,20,20);
  canvas.repaint();
}

Wird's so klarer?

Ebenius

Ich verstehe den ersten Code garnicht :S. Warum eigentlich extra eine neue Klasse eröffnen?
 

André Uhres

Top Contributor
Vielleicht noch zum grundlegenden Verständnis der allgemeinen Malmechanismen:
das AWT benutzt einen "callback" ("Wiederholungsbesuch") Mechanismus zum Zeichnen.
Das heißt, daß ein Programm den Darstellungscode der Komponente innerhalb einer bestimmten
überschriebenen Methode setzen sollte, und das Toolkit ruft diese Methode auf, wenn es Zeit ist zu malen.
Die zu überschreibende Methode ist in java.awt.Component:

Code:
public void paint(Graphics g)

Programme müssen dieses Graphics Object verwenden (oder ein von ihm abgeleitetes)
um die Oberfläche darzustellen. Sie sind frei, den Zustand des Graphics Objektes so zu ändern,
wie es benötigt wird.
Entwickler, die neu bei AWT sind, werden einen Blick auf das PaintDemo Beispiel werfen wollen,
das ein lauffähiges Programmbeispiel liefert, wie man den paint callback in einem AWT Programm verwendet:

PaintDemo
http://java.sun.com/products/jfc/tsc/articles/painting/src/PaintDemo.java

Um anwendungsausgelöstes Malen zu ermöglichen, liefert das AWT die folgenden java.awt.Component Methoden,
damit Programme einen asynchronen Malvorgang anfragen können:

Code:
   public void repaint() 
    public void repaint(long tm) 
    public void repaint(int x, int y, int width, int height) 
    public void repaint(long tm, int x, int y, int width, int height)

Da es bei einem Malprogramm umständlich wäre, die ganzen Zeichnereien in der paint Methode nachzuvollziehen,
zeichnet man einfach auf ein Image und malt das Image dann in der paint Methode mit g.drawImage(..):
Code:
private Canvas canvas;
private Graphics2D g2d;
private BufferedImage image;
...
canvas = new Canvas() {

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        if (image == null) {
            image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
            g2d = (Graphics2D) image.getGraphics();
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            g2d.setColor(Color.white);
            g2d.fillRect(0, 0, getWidth(), getHeight());
            g2d.setColor(Color.black);
        }
        Rectangle r = g.getClipBounds();
        g.drawImage(image, r.x, r.y, r.width + r.x, r.height + r.y,
                r.x, r.y, r.width + r.x, r.height + r.y, null);

    }
};
Zum Speichern brauchen wir dann weiter nix zu machen, als das image in die Datei zu schreiben:
Code:
ImageIO.write(image, "JPEG", new File("bild.jpg"));

Und hier noch ein Beispiel: http://www.java-forum.org/de/userfiles/user3690/PaintDemo2.java
 

Ebenius

Top Contributor
Javalus hat gesagt.:
Hab einfach add(canvas) gemacht :?

Die API-Doc der Canvas-Klasse sagt:
A Canvas component represents a blank rectangular area of the screen onto which the application can draw or from which the application can trap input events from the user.

An application must subclass the Canvas class in order to get useful functionality such as creating a custom component. The paint method must be overridden in order to perform custom graphics on the canvas.

Ebenius
 
J

Javalus

Gast
Hmm krieg bei canvas.getOffscreenImage() immer nen Fehler dass es nich gefunden wird
 
J

Javalus

Gast
Ebenius hat gesagt.:
Du musst Deine canvas-Variable als ZeichenCanvas deklarieren.

java:159:20: cannot find symbol
symbol : variable ZeichenCanvas
Graphics g = ZeichenCanvas.getOffscreenImage().getGraphics();
 

Ebenius

Top Contributor
Du musst die ZeichenCanvas-Klasse (siehe oben) auch in Dein Projekt mit aufnehmen.

Und Du solltest mal ein Java-Buch für die Grundlagen zur Hand nehmen. Da lernst Du mehr, als beim durchhangeln.

Ebenius
 

André Uhres

Top Contributor
In meinem Beitrag oben findest du ganz unten im Beitrag einen Link zu einem funtkionierenden Beispiel. Der Beitrag selbst gibt auch wissenswerte Hintergrundinformationen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Canvas-Inhalt in Laufzeit ändern AWT, Swing, JavaFX & SWT 6
P Canvas Inhalt löschen AWT, Swing, JavaFX & SWT 4
D Inhalt einer Canvas löschen (SWT.NO_BACKGROUND gesetzt) AWT, Swing, JavaFX & SWT 3
P Inhalt eines Canvas verkleinern AWT, Swing, JavaFX & SWT 3
H JavaFX Canvas neu zeichnen anstoßen AWT, Swing, JavaFX & SWT 34
H JavaFX Gedrehter Text auf Canvas (Positionierung) AWT, Swing, JavaFX & SWT 6
ExceptionOfExpectation Textdarstellung auf einem Canvas mit Hilfe von repaint(); AWT, Swing, JavaFX & SWT 6
W Clear Canvas und anschließendes neues Erstellen von Objekten auf Canvas aus ArrayList AWT, Swing, JavaFX & SWT 4
W Canvas oder Polygone? AWT, Swing, JavaFX & SWT 3
Monokuma Canvas Form entfernen AWT, Swing, JavaFX & SWT 2
Monokuma KeyEvent in der Canvas Klasse AWT, Swing, JavaFX & SWT 0
M Internal Frames und Canvas-Element AWT, Swing, JavaFX & SWT 9
TheJavaKid Auf eine Zeichnung im Canvas reagieren AWT, Swing, JavaFX & SWT 13
M Halbkreiszeichnen(Canvas) - Diesen mit Mouseevents bestücken AWT, Swing, JavaFX & SWT 3
dereki2000 AWT Canvas zeichnet nicht AWT, Swing, JavaFX & SWT 7
D Canvas oder scene graph? AWT, Swing, JavaFX & SWT 16
J Canvas wird nicht angezeigt AWT, Swing, JavaFX & SWT 10
Y Objekte grafisch darstellen ohne GMF - Composite auf Canvas? AWT, Swing, JavaFX & SWT 2
Prafy AWT Klickbare Bereiche auf Canvas AWT, Swing, JavaFX & SWT 2
J JavaFX JavaFX Canvas einfaches Zeichenprogramm AWT, Swing, JavaFX & SWT 7
P MalProgramm mit JScrollPane und Canvas AWT, Swing, JavaFX & SWT 2
Cromewell JavaFX Nur bestimmten Teil eines Canvas rendern und anzeigen AWT, Swing, JavaFX & SWT 2
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4
L JavaFX Canvas max size? AWT, Swing, JavaFX & SWT 1
J JavaFX Rendering von Canvas sehr langsam AWT, Swing, JavaFX & SWT 2
P AWT Canvas freihändig zeichnen AWT, Swing, JavaFX & SWT 1
Regedit JavaFX Java Canvas hört ständig auf zu aktualisieren/malen AWT, Swing, JavaFX & SWT 3
H JavaFX Freezes beim Zeichnen mit Canvas AWT, Swing, JavaFX & SWT 3
Z Canvas in Frame einfügen. Problem mit 4-Gewinnt AWT, Swing, JavaFX & SWT 1
B JavaFX KeyEvent und Canvas draw Problem AWT, Swing, JavaFX & SWT 9
K Fragen zu JavaFx Canvas AWT, Swing, JavaFX & SWT 0
C Java FX Canvas missing getGraphicContext2D AWT, Swing, JavaFX & SWT 5
windl Overlay mit Transparentem JWindow und Canvas AWT, Swing, JavaFX & SWT 2
S JavaFX Canvas - nur eine Figur auf der Zeichenfläche färben? AWT, Swing, JavaFX & SWT 1
R JComponent auf Canvas AWT, Swing, JavaFX & SWT 8
S Canvas durch transparentes JPanel sichtbar machen AWT, Swing, JavaFX & SWT 2
A JavaFX Menubar wird von Canvas überzeichnet AWT, Swing, JavaFX & SWT 8
antonbracke Multiplayer Shooter- Wie geht das mit Canvas & Graphics AWT, Swing, JavaFX & SWT 6
Luk10 KeyBindings mit Canvas? AWT, Swing, JavaFX & SWT 3
B LookAndFeel GWT: Canvas in TabSet nicht sichtbar AWT, Swing, JavaFX & SWT 2
K canvas zeig nach repaint nichts an AWT, Swing, JavaFX & SWT 8
T Canvas clipping AWT, Swing, JavaFX & SWT 4
S 2 Canvas übereinander AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Canvas Problem(Größe) AWT, Swing, JavaFX & SWT 6
K 3D-Grafik Canvas ist ein eigener Frame?! AWT, Swing, JavaFX & SWT 13
F Canvas Objekt außerhalb des Frames zeichnen AWT, Swing, JavaFX & SWT 3
M Wofür Canvas? AWT, Swing, JavaFX & SWT 5
frankred Swing Canvas nach "Window-resize" neu Zeichnen lassen wegen Anzeigefehler AWT, Swing, JavaFX & SWT 4
S Canvas in ScrollPane wird beim scrollen immer neu gezeichnet AWT, Swing, JavaFX & SWT 3
F Nur ein Objekt auf Canvas neu zeichnen AWT, Swing, JavaFX & SWT 4
B AWT Canvas überdeckt nach repaint() JComboBox-Optionen AWT, Swing, JavaFX & SWT 2
lumo SWT Canvas transparent AWT, Swing, JavaFX & SWT 4
2 AWT Zeichnen in Canvas AWT, Swing, JavaFX & SWT 5
B 2D-Grafik Malen/übermalen mit Canvas AWT, Swing, JavaFX & SWT 5
L Dynamisch Objekte in Canvas zeichnen AWT, Swing, JavaFX & SWT 5
G Auf Canvas zeichnen nur über boolean-Abfragen? AWT, Swing, JavaFX & SWT 5
R In JFrame oder in Canvas mit grafischen Elemente zeichnen AWT, Swing, JavaFX & SWT 2
I Canvas Repaint Probleme AWT, Swing, JavaFX & SWT 2
S Bild wird auf Canvas in Applet nicht gezeichnet AWT, Swing, JavaFX & SWT 4
G SWT Linie unter transparentes Canvas zeichnen AWT, Swing, JavaFX & SWT 4
F Swing Paint mit Canvas Element AWT, Swing, JavaFX & SWT 35
S SWT Canvas: Flackernde Bilder AWT, Swing, JavaFX & SWT 3
T AWT canvas AWT, Swing, JavaFX & SWT 3
P Canvas: String wird nicht gezeichnet AWT, Swing, JavaFX & SWT 5
T SWT Canvas Koordinaten per MouseMove auslesen AWT, Swing, JavaFX & SWT 1
H Zeichnen auf smartgwt Canvas AWT, Swing, JavaFX & SWT 4
G Drag and Drop JTree to Canvas AWT, Swing, JavaFX & SWT 7
K Swing Sinuskurve zeichnen auf Canvas AWT, Swing, JavaFX & SWT 2
M AWT Component/Canvas erzeugt unerwünschten Rahmen bei paint AWT, Swing, JavaFX & SWT 3
J Canvas / paint() AWT, Swing, JavaFX & SWT 2
D Canvas soll angezeigtes jpg-Bild aktualisieren AWT, Swing, JavaFX & SWT 4
N zeichnen auf awt canvas AWT, Swing, JavaFX & SWT 9
G Ein Wort in einem String färben in einer Canvas AWT, Swing, JavaFX & SWT 10
T zeichnen mit canvas AWT, Swing, JavaFX & SWT 3
S repaint im Canvas AWT, Swing, JavaFX & SWT 3
D Canvas und Buttons AWT, Swing, JavaFX & SWT 20
P Zeichnen in Canvas und Neuzeichnen AWT, Swing, JavaFX & SWT 3
G Canvas + Swing-Objekte AWT, Swing, JavaFX & SWT 5
C canvas.draw zeichne ohne ausfüllen AWT, Swing, JavaFX & SWT 9
P Canvas in JFrame mit GridLayout AWT, Swing, JavaFX & SWT 4
B Graphics und Canvas - Problem AWT, Swing, JavaFX & SWT 2
T Canvas gegen Container austauschen --> GUI fehlt AWT, Swing, JavaFX & SWT 4
D Canvas über JMenuBar AWT, Swing, JavaFX & SWT 7
F ToolTip auf Canvas AWT, Swing, JavaFX & SWT 2
L Probleme mit mehreren Canvas: Überlagerungseffekte? AWT, Swing, JavaFX & SWT 5
N Zu hoher Speicherverbrauch beim Zeichnen (Canvas) AWT, Swing, JavaFX & SWT 5
G Canvas im JPanel - "Freie" Fläche Problem AWT, Swing, JavaFX & SWT 10
T Textfeldwert in canvas AWT, Swing, JavaFX & SWT 4
D cannot access Canvas AWT, Swing, JavaFX & SWT 13
G Canvas in SWT aktualisieren AWT, Swing, JavaFX & SWT 21
S AUF Canvas Zeichnen Fehler! AWT, Swing, JavaFX & SWT 10
G Canvas löschen AWT, Swing, JavaFX & SWT 15
H Sowas wie ein Canvas AWT, Swing, JavaFX & SWT 3
G GridBagLayout mit Canvas-Positionsproblem AWT, Swing, JavaFX & SWT 5
J Canvas und JTextField AWT, Swing, JavaFX & SWT 2
T erkennen ob innerhalb oder außerhalb von canvas gezeichnet AWT, Swing, JavaFX & SWT 2
S Problemen mit Canvas-Objekten im GridLayout AWT, Swing, JavaFX & SWT 8
P Tranparentes Canvas AWT, Swing, JavaFX & SWT 8
G Canvas, JMenu, und BufferStrategy AWT, Swing, JavaFX & SWT 2
M Codeteilung -> Canvas zeichnet nicht mehr AWT, Swing, JavaFX & SWT 40

Ähnliche Java Themen

Neue Themen


Oben