# Animiertes GIF auf JPG Hintergrund darstellen?



## SebSnake (26. Mai 2008)

Hallo zusammen!

Ich habe folgendes Problem:
Ich versuche eine gif-Animation mit Transparenz auf einem jpg-Hintergrund darzustellen.
Kenne mich momentan weder mit AWT noch mit SWING perfekt aus, da dies im Studium erst in den folgenden Wochen drangenommen wird 

Bisher habe ich 2 Teillösungen gefunden, die beide jeweils einen Fehler haben.

Die erste Lösung stellt das gif auf dem jpg dar, jedoch wird es nicht animiert...

Die zweite Lösung animiert das gif, jedoch ist das jpg "nicht vorhanden"...


1. Lösung:

```
package test008;

import javax.swing.*;
import java.awt.*;
import java.io.File;
import javax.imageio.*;
import java.awt.image.BufferedImage;

public class Zeichnung extends JFrame {
	static BufferedImage img1 = null;
	static BufferedImage img2 = null;

	public Zeichnung() {
		try {
			img1 = ImageIO.read(new File("run.gif"));
			img2 = ImageIO.read(new File("landschaft.jpg"));
		} catch (Exception e) {
			System.out.println("error");
		}
	}

	public void paint(Graphics g) {
		super.paint(g);
		g.drawImage(img2, 0, 0, 600, 400, this);
		g.drawImage(img1, 200, 200, 400, 105, this);
	}

	public void paintComponent(Graphics g) {
		g.drawImage(img1, 200, 200, 400, 105, this);
	}

	public static void main(String[] args) {
		Zeichnung fenster = new Zeichnung();
		fenster.setTitle("Zeichnung");
		fenster.setSize(608, 434);
		fenster.setVisible(true);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}
}
```



2. Lösung:

```
package test006;

import javax.swing.*;

public class Zeichnung extends JFrame {
	ZeichenPanel pana;
	ZeichenPanel2 panb;

	public Zeichnung() {
		pana = new ZeichenPanel();
		panb = new ZeichenPanel2();
		add(panb);
		add(pana);
	}

	public static void main(String[] args) { 
		Zeichnung fenster = new Zeichnung();
		fenster.setTitle("Zeichnung");
		fenster.setSize(608, 434);
		fenster.setVisible(true);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}



package test006;

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

public class ZeichenPanel extends JPanel {
	public void paintComponent(Graphics g) {
		try {
			g.clearRect(0, 0, 600, 400);
			Color farb = new Color(0, 0, 0, 0);
			setBackground(farb);
			Image pic = Toolkit.getDefaultToolkit().getImage("run.gif");
			g.setColor(farb);
			g.drawImage(pic, 200, 200, 400, 105, this);
		} catch (Exception e) {
			System.out.println("error");
		}
	}
}



package test006;

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

public class ZeichenPanel2 extends JPanel {
	public void paintComponent(Graphics g) {
		try {
			g.clearRect(0, 0, 600, 400);
			Color farb = new Color(0, 0, 0, 0);
			setBackground(farb);
			Image pic2 = Toolkit.getDefaultToolkit().getImage("landschaft.jpg");
			g.setColor(farb);
			g.drawImage(pic2, 0, 0, 600, 400, this);
		} catch (Exception e) {
			System.out.println("error");
		}
	}
}
```



Könnt ihr mir vllt helfen und sagen, wo bei beidem der Fehler ist?
Sitz da jetzt seit ca 5 Stunden dran und bekomm es nicht hin...


----------



## Quaxli (26. Mai 2008)

Nicht unbedingt eine Lösung, aber ein paar Anmerkungen:

In der 1. Variante überschreibst Du sowohl die paint- als auch die paintComponent-Methode. Letzteres reicht völlig und ist bei Swing auch die richtige Wahl. Allerdings fehlt bei beiden Varianten in paintComponent der super-Aufruf (evtl. schon die Lösung Deines Problems?).

Bei der 2. Lösung lädst Du das Bild in der paintComponent-Methode jedesmal neu, das ist eine ziemliche Spaßbremse . 
Außerdem fehlt Dir in der 2. Variante eine Layout-Manager, der es Dir erlaubt, 2 Panels vernünftig in den JFrame zu packen, daß ist vermutlich das grundsätzliche Problem an der Lösung.

Aus meiner Erfahrung ist es grundsätzlich aber eher Glücksache, wenn ein animiertes Gif vernünftig angezeigt wird. Ich würde daher grundsätzlich Animationen als Einzelbilder abspeichern und "mit Bordmitteln" selbst erzeugen. Dann kannst Du sicher sein, daß die Animation auch auf anderen Rechner vernünftig funktioniert.


----------



## Guest (26. Mai 2008)

Ok, hab beides mal ausprobiert, und komme zu folgendem Ergebnis:

Lösung #1:


```
package test008;

import javax.swing.*;
import java.awt.*;
import java.io.File;
import javax.imageio.*;
import java.awt.image.BufferedImage;

public class Zeichnung extends JFrame {
	static BufferedImage img1 = null;
	static BufferedImage img2 = null;

	public Zeichnung() {
		try {
			img1 = ImageIO.read(new File("run.gif"));
			img2 = ImageIO.read(new File("landschaft.jpg"));
		} catch (Exception e) {
			System.out.println("error");
		}
	}

	public void paintComponent(Graphics g) {
		super.paintComponents(g);
		g.drawImage(img2, 0, 0, 600, 400, this);
		g.drawImage(img1, 200, 200, 400, 105, this);
	}

	public static void main(String[] args) {
		Zeichnung fenster = new Zeichnung();
		fenster.setTitle("Zeichnung");
		fenster.setSize(608, 434);
		fenster.setVisible(true);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	}
}
```

Hab hier halt jetzt nur noch den paintComponent drin, dafür bleibt nach dem Compilieren das GUI-Fenster aber leer. Nichts mehr da, also kein Bild, nur "grau". Bilder werden aber geladen, soll heißen die System.out-Anweisung wird nicht ausgeführt.







Lösung #2:

```
package test006;

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

public class Zeichnung extends JFrame {
	Color farb = new Color(0, 0, 0, 0);
	ZeichenPanel pana;
	ZeichenPanel2 panb;

	public Zeichnung() {
		JLayeredPane layeredPane = new JLayeredPane();
		layeredPane.setSize(608, 434);
		layeredPane.setBorder(BorderFactory.createTitledBorder(
		                                    "Spielfeld"));
		pana = new ZeichenPanel();
		panb = new ZeichenPanel2();
		panb.setBounds(0, 0, 600, 400);
		pana.setBounds(100, 200, 400, 105);
		pana.setBackground(farb);
		panb.setBackground(farb);
		layeredPane.add(panb, 0);
		layeredPane.add(pana, 1);
		add(layeredPane);
	}

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



package test006;

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

public class ZeichenPanel extends JPanel {
	Image pic1;

	public ZeichenPanel(){
		pic1 = Toolkit.getDefaultToolkit().getImage("run.gif");
	}
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		try {
			g.clearRect(0, 0, 600, 400);
			g.drawImage(pic1, 0, 0, 400, 105, this);
		} catch (Exception e) {
			System.out.println("error");
		}
	}
}



package test006;

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

public class ZeichenPanel2 extends JPanel {
	Image pic2;
	
	public ZeichenPanel2(){
		pic2 = Toolkit.getDefaultToolkit().getImage("andschaft.jpg");
	}
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		try {
			g.clearRect(0, 0, 600, 400);;
			g.drawImage(pic2, 0, 0, 600, 400, this);
		} catch (Exception e) {
			System.out.println("error");
		}
	}
}
```


Hier siehts schon besser aus: Die Bilder werden beide geladen, das gif ist auch animiert, nur die Transparenz stellt er nicht dar. Also das hier ist fast fertig, es fehlen nur noch die 1-2 Anweisungen, um eben das gif transparent darzustellen. Jemand eine Idee?[/quote]


----------



## SebSnake (26. Mai 2008)

Sorry, hab vergessen mich einzuloggen.
Ich bekomm es immernoch nicht hin, rumprobieren hilft nicht so ganz... ^^

EDIT:

Ok, hab jetzt eine lauffähige Version, aber ziemlich unschön programmiert....

Wenn mir die einer herrichten könnte wäre das klasse 


```
package test006;

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

public class Zeichnung extends JFrame {
	Color farb = new Color(0, 0, 0, 0);
	ZeichenPanel pana;
	ZeichenPanel2 panb;

	public Zeichnung() {
		JLayeredPane layeredPane = new JLayeredPane();
		layeredPane.setSize(608, 434);
		layeredPane.setBorder(BorderFactory.createTitledBorder(
		                                    "Spielfeld"));
		pana = new ZeichenPanel();
		panb = new ZeichenPanel2();
		panb.setBounds(0, 0, 600, 400);
		pana.setBounds(100, 200, 400, 105);
		pana.setBackground(farb);
		panb.setBackground(farb);
		layeredPane.add(panb, 0);
		layeredPane.add(pana, 1);
		add(layeredPane);
	}

	public static void main(String[] args) {
		Zeichnung fenster = new Zeichnung();
		fenster.setTitle("Zeichnung");
		fenster.setSize(608, 434);
		fenster.setVisible(true);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}




package test006;

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

public class ZeichenPanel extends JPanel {
	Image pic1;

	public ZeichenPanel(){
		pic1 = Toolkit.getDefaultToolkit().getImage("run.gif");
	}
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		try {

                        // Hier meine "LÖSUNG"
			g.drawImage(ZeichenPanel2.pic2, -100, -200, 600, 400, this);		
			g.drawImage(pic1, 0, 0, 400, 105, this);
                        // Ende der Lösung ^^

		} catch (Exception e) {
			System.out.println("error");
		}
	}
}




package test006;

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

public class ZeichenPanel2 extends JPanel {
	static Image pic2;
	
	public ZeichenPanel2(){
		pic2 = Toolkit.getDefaultToolkit().getImage("landschaft.jpg");
	}
	
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		try {
			g.drawImage(pic2, 0, 0, 600, 400, this);
		} catch (Exception e) {
			System.out.println("error");
		}
	}
}
```






EDIT2:

Fertig!! Ich habs gebacken bekommen! Und konnte sogar ne ganze Klasse einsparen 
Im Endeffekt hat nur der Layoutmanager gefehlt.
Hier der Restcode.


```
package test006;

import javax.swing.*;

public class Zeichnung extends JFrame {
	ZeichenPanel pana;

	public Zeichnung() {
		JLayeredPane layeredPane = new JLayeredPane();
		layeredPane.setSize(608, 434);
		layeredPane.setBorder(BorderFactory.createTitledBorder(
		                                    "Spielfeld"));
		pana = new ZeichenPanel();
		pana.setBounds(0, 0, 600, 400);
		layeredPane.add(pana, 0);
		add(layeredPane);
	}

	public static void main(String[] args) {
		Zeichnung fenster = new Zeichnung();
		fenster.setTitle("Zeichnung");
		fenster.setSize(608, 434);
		fenster.setVisible(true);
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}





package test006;

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

public class ZeichenPanel extends JPanel {
	Image pic1;
	Image pic2;

	public ZeichenPanel(){
		pic1 = Toolkit.getDefaultToolkit().getImage("run.gif");
		pic2 = Toolkit.getDefaultToolkit().getImage("landschaft.jpg");
	}
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		try {
			g.drawImage(pic2, 0, 0, 600, 400, this);		
			g.drawImage(pic1, 200, 200, 400, 105, this);
		} catch (Exception e) {
			System.out.println("error");
		}
	}
}
```


----------

