2009-04-22 26 views
22

Qualcuno è riuscito a convincere ImageIO a scrivere una GIF animata, in particolare impostando i metadati corretti? Il mio primo tentativo è più o meno come segue (dove B1 e B2 sono BufferedImages):Creazione di GIF animate con ImageIO?

ImageTypeSpecifier spec = new ImageTypeSpecifier(b1); 
ImageWriter wr = ImageIO.getImageWriters(spec, "GIF").next(); 
wr.setOutput(ImageIO.createImageOutputStream(new File("C:\\Flashing.gif"))); 
ImageWriteParam param = wr.getDefaultWriteParam(); 
IIOMetadata meta = wr.getDefaultImageMetadata(spec, param); 
wr.prepareWriteSequence(meta); 
wr.writeToSequence(new IIOImage(b1, null, null), param); 
wr.writeToSequence(new IIOImage(b2, null, null), param); 

Questo sembra quasi di lavoro, ma:

  • ho bisogno chiaramente di impostare in qualche modo i metadati "corretta" per impostare la tempo tra le immagini e idealmente renderle cicliche (stavo sperando ingenuamente che il default avrebbe fatto qualcosa di sensato, ma hey ...)
  • qualunque metadata stia scrivendo di default non è ovviamente giusto: il GIMP dà un paio di errori messaggi durante il caricamento del file, sebbene l'integrazione dell'immagine in una pagina Web di prova in Firefox visualizzi il tw o immagini in rapida successione, che è tantilisingly vicino a quello che voglio ...

Se qualcuno ha la scrittura GIF animate da ImageIO al lavoro e possono condividere un frammento di codice o di lavoro come risolvere i problemi di cui sopra , Sarebbe molto apprezzato!

risposta

29

Mi sono imbattuto in questa domanda e ho deciso di provarlo; Ci è voluta una piccola ma non banale quantità per creare una classe utilizzabile (grazie ax), così ho pensato di condividere il codice: here è una piccola classe per la creazione di un'immagine GIF animata da un numero di altre immagini.

+1

C'è un errore nell'esempio fornito all'interno della funzione main(). Commenti dicono: '// una sequenza gif con il tipo della prima immagine, 1 secondo tra i fotogrammi, che si interrompe continuamente, che sarebbe' nuovo GifSequenceWriter (output, firstImage.getType(), 1000, true) 'invece di 'new GifSequenceWriter (output, firstImage.getType(), 1, false)' – gvlasov

+3

Inoltre, se si scopre che i colori trasparenti non vengono gestiti correttamente (quando si scrive un colore trasparente, un pixel del fotogramma precedente si mantiene), è necessario per fare ciò: trova una riga con 'graphicsControlExtensionNode.setAttribute (" disposalMethod "," none ");' e cambia '" none "' '' 'restoreToBackgroundColor" ' – gvlasov

+0

Il tuo codice è ancora referenziato su StackOverflow [4 anni dopo] (http://stackoverflow.com/questions/16649620/is-there-a---to-create-one-gif-image-from-multiple-images-in-java) e ho intenzione di usarlo 7 anni dopo:) – Aaron

Problemi correlati