# Paintsurface ins Bild konvertieren



## Guest (21. Aug 2008)

Hallo,
ist es moeglich den Paintsurface Inhalt zu jeder Zeit in ein Bild zu konvertieren und wenn ja gibt es dazu ein Beispeil?

Viele Grüße


----------



## 0x7F800000 (21. Aug 2008)

was isn ein "Paintsurface" ? In der API scheint es sowas nicht zu geben, alles was google liefert, ist diese seite hier, und ein paar andere beispiele aus den foren von irgendwelchen privatleuten...  :autsch:


----------



## Marco13 (22. Aug 2008)

Vermutlich meint er den Inhalt einer Component (*Kristallkugel grad frisch geputzt hat* :wink: )
Falls ja: BufferedImage erstellen, mit component.paintComponent(bufferedImage.getGraphics()); die component dort reinmalen, BufferedImage mit ImageIO speichern. 
Falls nein: Häh?


----------



## Guest (22. Aug 2008)

Sorry fuer die fehlende Information.
@Marco13: Danke, deine Kristallkugel ist spitze. "PaintSurface extends JComponent" und dort wird alles gezeichnet und dessen Inhalt wollte ich dann in ein Bild speichern.


----------



## Marco13 (22. Aug 2008)

Falls die Frage noch nicht beantwortet ist: http://www.java-forum.org/de/viewtopic.php?p=177343 der 5. Beitrag


----------



## flashdog (27. Aug 2008)

Danke Marco13 fuer den Link.


----------



## flashdog (1. Sep 2008)

Habe leider folgendes Problem. Programm startet und es erscheint auf dem Bildschirm ein gelber Ball. Wenn man den init Button klickt erscheint ein
zweiter Ball auf dem Bildschirm.

Wenn man auf Screenshoot klickt wird ein PNG Bild erzuegt aber nur mit dem ersten Ball. 


```
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;

import javax.swing.*;

public class BallRoom extends JApplet implements ActionListener, Runnable {
	private final int WIDTH = 350;
	private final int HEIGHT = 300;
	private PaintSurface canvas;
	private JButton screenshot, init;
	private GenerateScreenshot MakeScreenshot;
	private JPanel control;
	private boolean pIDs[];

	public void init() {     
		this.setSize(WIDTH, HEIGHT);
		pIDs = new boolean[4];

		for (int i = 1; i <= 4; i++) {
			pIDs[i-1] = true;               
		}
		
		canvas = new PaintSurface();
		this.add(canvas, BorderLayout.CENTER);

		control = new JPanel();
		init = new JButton("init");
		init.addActionListener(this);
		screenshot = new JButton("screenshot");
		screenshot.addActionListener(this);
		control.add(init);
		control.add(screenshot);
		this.add(control, BorderLayout.SOUTH);


		MakeScreenshot = new GenerateScreenshot();
	}

	public void run() {

	}

	public void update(Graphics g) {
		paint(g);
	}

	public void actionPerformed(ActionEvent e){
		if (e.getSource() == init){
			canvas.initialization = true;
			canvas.repaint();
		}
		if (e.getSource() == screenshot){
			try {
				MakeScreenshot.generatePNGFileFromComponent(canvas, "E:\\human\\test.png");
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		}
	}
}
```


```
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import javax.swing.JComponent;

class PaintSurface extends JComponent {
	
	private String r;
	boolean initialization = false;
	private boolean pIDs[];
	private Color color[] = {Color.BLACK, Color.RED, Color.YELLOW, Color.GREEN, 
				Color.BLUE, Color.ORANGE, Color.PINK, Color.BLACK, Color.GRAY, Color.LIGHT_GRAY};
  int d = 20; // the diameter of the ball
	final float ScalingFactor = 2;
	final float ElipseSize = 2;

  
	public void Initialization(Graphics2D g2){
		System.out.println("Initialization");

				g2.setColor(color[2]);
				Shape molecule = new Ellipse2D.Float(30 * ScalingFactor, 6 * ScalingFactor, 20, 20);
  			g2.fill(molecule);
	}

  @Override
  public void paintComponent(Graphics g) {
  	Graphics2D g2 = (Graphics2D)g;
 	if (initialization == true){
  		Initialization(g2);
  		initialization = false;
  	}
 	g2.setColor(color[2]);
	Shape molecule = new Ellipse2D.Float(2 * ScalingFactor, 4 * ScalingFactor, 20, 20);
	g2.fill(molecule);
  }
}
```


```
import java.awt.Component;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class GenerateScreenshot {
	public  BufferedImage generateBufferedImageFromComponent(Component component) {
		BufferedImage image = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_RGB);
		Graphics g = image.getGraphics();
		g.setColor(component.getBackground());
		g.fillRect(0, 0,  image.getWidth(), image.getHeight());
		component.print(g);
		g.dispose();
		return image;
	}
	public  void generatePNGFileFromComponent(Component component, String filename) throws IOException {
		generatePNGFileFromComponent(component, new File(filename));
	}
	public  void generatePNGFileFromComponent(Component component, File file) throws IOException {
		BufferedImage image = generateBufferedImageFromComponent(component);
		ImageIO.write(image, "png", file);
	}
}
```


Warum werden nicht beide Baelle im PNG dargestellt und wie bekommt man es hin das beide Baelle im PNG Bild erscheinen?


----------



## Marco13 (1. Sep 2008)

Das mit der "initialization" ist eben ... falsch. Innerhalb der paint-Methode wird der Zustand der "PaintSurface" geändert. Man könnte jetzt zwar vor dem Abspeichern "initialization" nochmal auf true setzen, aber das wäre immernoch Murks. Vielleicht müßte auch nur die Zeile "initialization = false;" aus der paintComponent rausgenommen werden. Aber was auch immer mit diesem "initialization" erreicht werden sollte: Du solltest es anders machen. In der paintComponent sollte NUR gezeichnet, und NICHT der Zustand der PaintSurface verändert werden.


----------



## flashdog (2. Sep 2008)

Danke fuer den Tip.


----------

