GIF splitten

Status
Nicht offen für weitere Antworten.

Grey_M

Aktives Mitglied
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

Top Contributor
Das BufferedImage hat die Funktion
Java:
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 :
Java:
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
Java:
 ImageIO.write(RenderedImage im, String formatName, File output)
auf die Platte schieben.

Hoffe alle Fragen sind damit Gelöst
 
Zuletzt bearbeitet:

Grey_M

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

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

Wenn ich
Java:
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

Top Contributor
Hey versuch doch einfach mal:
Java:
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
Java:
 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

Top Contributor
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

Bekanntes Mitglied
@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

Top Contributor
Ach so, der hat ein gif mit mehreren ebenen, ja das muss er schon sagen? Gut dan schau mal hier das hier an:
Java:
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

Aktives Mitglied
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?
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben