# Bild kopieren



## marasek (13. Jul 2009)

Ich schreibe gerade eine Bildergalerie, die automatisch durchlaufen soll. Dummerweise hat er mir immer das erste Bild massakriert, klaro: darauf habe ich fröhlich geschrieben, deswegen war die Instanz natürlich immer geändert.

Prinzipiell läuft das:

```
public void init() {
		this.dim = this.getSize();
		this.galerie = new Galerie();
		this.setSize(800,600);
		BufferedImage firstImage = this.galerie.getImage();
		WritableRaster firstRaster = firstImage.getRaster();
		WritableRaster newRaster = firstImage.copyData(firstRaster);
		this.activeImage = new BufferedImage(firstImage.getColorModel(), newRaster, true, null);
		this.runner = new Thread(this);
		this.runner.start();
	}

	public void run() {
		System.out.println("next");
		Crossover crossover;
		while(true) {
			try {
				Thread.sleep(200);
			} catch (Exception e) {
				throw new Error(e.getMessage());
			}
			this.galerie.increment();
			crossover = new CrossoverPixelate(this.activeImage, this.galerie.getImage(), this);
			crossover.execute();
		}
	}
	public void paint(Graphics g) {
		super.paint(g);
		g.drawImage(this.activeImage,0,0, this);
	}
```

In init() habe ich jetzt versucht, eine Kopie zu machen, aber das wohl nicht richtig, das Problem bleibt bestehen: die Bilder rödeln durch, aber das letzte wird doppelt solange angezeigt, bevor das zweite wieder kommt, d. h. das Objekt wird immer noch verändert. Wie bekomme ich das erste Bild geklont? Oder mache ich im Ansatz was falsch?


----------



## Teh_Lord (19. Jul 2009)

Mir fiel jetzt bei deinem Code auf den ersten Blick auf, dass in deiner Paint Methode kein Hintergrund gezeichnet wird. Also werden die Bilder immer drübergezeichnet ohne "zurücksetzen" der Zeichenebene.
Würde das folgendermaßen lösen:

```
public void paint(Graphics g) {
        super.paint(g);

        // Hintergrund
        g.setColor(Color.BLACK); 
        g.fillRect(0,0,this.getWidth(),this.getHeight());

        // Bild 
        g.drawImage(this.activeImage,0,0, this);
    }
```

Desweiteren: In deiner Run-Methode der Sleep ist nur 200.
Das ist mh... lass mich nicht lügen... etwa 1/5 Sekunde. 
Etwas schnell für ne Bildergalerie, oder willst du ne Art Daumenkino machen? 
Die Zahl die da stehen sollte wäre bei x Sekunden -> x*1000.

Ansonsten... mh.. versuch's mal so:

```
public void init() {
        this.dim = this.getSize();
        this.galerie = new Galerie();
        this.setSize(800,600);
        this.activeImage = this.galerie.getImage();
        this.runner = new Thread(this);
        this.runner.start();
    }
 
    public void run() {
        System.out.println("next");
        while(true) {
            try { Thread.sleep(2000);
            } catch (Exception e) { throw new Error(e.getMessage()); }
            this.galerie.increment();
        }
    }
    public void paint(Graphics g) {
        super.paint(g);
        g.setColor(Color.BLACK);
        g.fillRect(0,0,this.getWidth(),this.getHeight());
        g.drawImage(this.activeImage,0,0, this);
    }
```

- Micha


----------



## marasek (19. Jul 2009)

Danke für die Antwort, mittlerweile habe ich eine Lösung für das Problem gefunden - gepfuscht lädt die Klasse Galerie gerade das erste Bild tatsächlich zweimal, einmal als Hintergrund und dann fürs weitere drüberzeichnen.

Gelöst werden kann das Problem natürlich besser mit new BufferedImage als Hintergrund, das produzierte bei mir eine OOB-Exception. Weil die Bilder grösser waren als gedacht und ich die OOB falsch interpretiert habe.

500 habe ich zum Testen genommen, will ja nicht ewig warten, bis er einmal durch geht ;-)


----------

