Accedere ai frame delle GIF animate in Java con ImageIO

In questo articolo vedremo come convertire delle immagini animate dal formato gif, scomponendole in piu’ immagini png o jpg ognuna con un singolo frame dell’animazione, utilizzando le varie componenti incluse in javax.imageio

Le gif animate non sono altro che una collezione di singoli frame, che vengono mostrate in sequenza generando una animazione. In Java, grazie al package ImageIo, è abbastanza semplice convertire da un formato ad un altro una immagine, per esempio da jpg a png, ma nel caso di gif animate, la semplice conversione si ferma di solito al primo frame.

Vediamo come sia possibile accedere a tutti i frames, convertendoli singolarmente in un altro formato. In questo modo avremo una serie di jpg o png che, se guardate in sequenza, formeranno l’intera animazione.

public static void convert(String GIFFileName){
	try{
            File input = new File(GIFFileName);
    	    ImageInputStream stream = ImageIO.createImageInputStream(input);
            Iterator readers = ImageIO.getImageReaders(stream);
            if (!readers.hasNext())
                  throw new RuntimeException("No image reader found");

            ImageReader reader = (ImageReader) readers.next();
            reader.setInput(stream); 
            int n = reader.getNumImages(true); 
            System.out.println("Numero di frames: " + n);

            for (int i = 0; i < n; i++) {
                BufferedImage image = reader.read(i);				        File output = new File("converted/frame"+i+".png");
                ImageIO.write(image, "png", output);
            }
            stream.close();

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

Una volta ottenuto un ImageReader per il formato del file in input, possiamo accedere al numero di frames contenuti nell’animazione, attraverso il metodo reader.getNumImages(true). Basterà quindi ciclare su tutti i frame, ottenendo per ognuno una BufferedImage da convertire nel formato desiderato (nel nostro caso “png”).

 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.