# GIF splitten



## Grey_M (15. Sep 2009)

Hallo zusammen.

Ich habe hier ein GIF dessen einzelne Bilder ich in ein Array packen möchte.

Ich bin aktuell an dem Punkt angelangt, wo ich das GIF nun als BufferedImage vor mir liegen habe. Wie geht es nun aber weiter?

- Kann das BufferedImage von sich aus die einzelnen Bilder exportieren? (Ich denke nicht)
- Ist das BufferedImage der falsche Typ dafür? (Langsam glaube ich ja)
- Gibt es eine Hilfsklasse die mir die einzelnen Bilder aus dem BufferedImage exportiert? (Ich befürchte nein)

Ich bin für jeden Hinweis dankbar.

Matthias


----------



## dayaftereh (15. Sep 2009)

Das BufferedImage hat die Funktion 
	
	
	
	





```
public BufferedImage getSubimage(int x, int y, int w,int h)
```
 da bekommst du das zugeschnittene Image zurück.

kennst du das Tutorial von Quaxli, schau dir da mal die Funktion loadPics an, müsste so Seite 19 sein oder hier habe es gefunden :

```
private BufferedImage[] loadPics(String path, int pics){
		
		BufferedImage[] anim = new BufferedImage[pics];
		BufferedImage source = null;
		
		URL pic_url = getClass().getClassLoader().getResource(path);

		try {
			source = ImageIO.read(pic_url);
		} catch (IOException e) {}
		
		for(int x=0;x<pics;x++){
			anim[x] = source.getSubimage(x*source.getWidth()/pics, 0, 
					source.getWidth()/pics, source.getHeight());
		}
		
		return anim;
	}
```
Danke an Quaxli (hoffe ich darf das Posten) , hier das Spieletutorial

Oh sorry habe deine Frage nicht zu ende gelesen. Also das BufferedImage ist super, sei aber so gut und lade das Image nicht neu von der Platte, sondern speicher das In eine HashMap, damit es im speicher liegt. das zugeschnittene image kannst du mit der hilfe von 
	
	
	
	





```
ImageIO.write(RenderedImage im, String formatName, File output)
```
 auf die Platte schieben. 

Hoffe alle Fragen sind damit Gelöst


----------



## Grey_M (15. Sep 2009)

Das Tutorial von Quaxli kenne ich und ich habe mich auch daran orientiert.


```
public BufferedImage getSubimage(int x, int y, int w,int h)
```
funktioniert aber bei GIF's nicht.

Wenn ich

```
source = ImageIO.read(pic_url);
```
ausführe und "source" zeichnen lasse, dann bekomme wird nur das 1. Frame des GIF's gezeichnet, die anderen nicht. 

Für GIF's muss es irgend einen anderen Weg geben, den kenne ich nur leider nicht...


----------



## dayaftereh (15. Sep 2009)

Hey versuch doch einfach mal:

```
private BufferedImage[] loadPics(String path, int pics) {

		BufferedImage[] anim = new BufferedImage[pics];
		BufferedImage source = null;

		URL pic_url = getClass().getClassLoader().getResource(path);

		try {

			Image image = ImageIO.read(pic_url);

			source = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB);
			Graphics g = source.getGraphics();
			g.drawImage(image, 0, 0, null);

		} catch (IOException e) {
		}

		for (int x = 0; x < pics; x++) {
			anim[x] = source.getSubimage(x * source.getWidth() / pics, 0, source.getWidth() / pics, source.getHeight());
		}

		return anim;
	}
```

und spiele mal mit dem erstellen von dem neuen BufferedImage rum
	
	
	
	





```
BufferedImage(int width, int height, int imageType)
```
 und zwar mit dem imageType, schau mal in die  API unter BufferedImage welche Möglichkeiten es gibt, weil eigentlich müsste es gehen.


----------



## Illuvatar (15. Sep 2009)

Wenn die Methode von dayaftereh funktionieren sollte, würde mich das sehr wundern.
Wie es richtig funktioniert, weiß ich allerdings auch nicht. Vielleicht benötigst du irgendeine externe Lib die mit animated gifs umgehen kann.


----------



## andre111 (15. Sep 2009)

@dayaftereh: Ich glaube Grey_M mag nicht ein einzelnes Bild in mehrere Teilbilder zerlegen, sondern die einzelnen Bilder eines animierten gif auslesen. Wie das funktioniert hab ich aber auch keine Ahnung.


----------



## dayaftereh (15. Sep 2009)

Ach so, der hat ein gif mit mehreren ebenen, ja das muss er schon sagen? Gut dan schau mal hier das hier an: 

```
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class Test {

	public static void main(String[] args) throws IOException {
		URL url = ClassLoader.getSystemResource("image.gif");
		BufferedImage[] images = loadAllLayers(url);
		
		for (BufferedImage bufferedImage : images) {
			JLabel l = new JLabel(new ImageIcon(bufferedImage));
			JOptionPane.showMessageDialog(null, l);
		}

	}

	public static final BufferedImage[] loadAllLayers(URL url) throws IOException {
		
		ImageInputStream in = ImageIO.createImageInputStream(url.openStream());
		ImageReader readerIn = ImageIO.getImageReaders(in).next();

		readerIn.setInput(in, true, false);
		
		List<BufferedImage> layers = new ArrayList<BufferedImage>();
		int index = 0;
		while (true) {
			try {
				layers.add(readerIn.read(index++));
			} catch (IndexOutOfBoundsException e) {
				break;
			}
		}
		BufferedImage[] layersArray = layers.toArray(new BufferedImage[] {});
		
		readerIn.dispose();
		in.close();

		return layersArray;
	}

}
```
Also ich bekomme alle Layers geladen^^ vielicht ist das ja was er sucht!


----------



## Grey_M (15. Sep 2009)

Vielen Dank dayaftereh.

Dein letztes Codebeispiel hat funktioniert.  Das war nämlich genau das was ich gesucht habe. 

Ich selbst kann den Beitrag nun nicht als "Erledigt" markieren, oder?


----------



## Illuvatar (15. Sep 2009)

Müsstest du eigentlich können, das ist direkt neben dem Antworten-Button.


----------

