¿Alguien ha logrado convencer a ImageIO para que escriba un GIF animado y, en particular, establezca los metadatos correctos? Mi primer intento es aproximadamente como sigue (donde b1 y b2 son BufferedImages):Creando un GIF animado 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);
Esto parece casi trabajo, pero:
- necesito claridad para establecer alguna forma de metadatos "adecuada" para establecer la tiempo entre las imágenes e idealmente hacerlas en bucle (estaba ingenuamente esperando que el valor predeterminado hiciera algo sensato, pero bueno ...)
- independientemente de los metadatos que está escribiendo por defecto obviamente no es del todo correcto: el GIMP da un par de errores mensajes cuando se carga el archivo, aunque la incrustación de la imagen en una página web de prueba en Firefox muestra el tw o imágenes en una sucesión muy rápida, que es tantilisingly cerca de lo que quiero ...
Si alguien tiene que escribir GIF animados de ImageIO a trabajar y puede compartir un fragmento de código de trabajo o cómo solucionar los problemas anteriores , ¡podria ser muy apreciado!
Hay un error en el ejemplo proporcionado en la función main(). Los comentarios dicen: '// una secuencia gif con el tipo de la primera imagen, 1 segundo entre fotogramas, que bucles continuamente', que sería' new GifSequenceWriter (output, firstImage.getType(), 1000, true) 'en lugar de 'new GifSequenceWriter (output, firstImage.getType(), 1, false)' – gvlasov
Además, si descubres que los colores transparentes no se manejan correctamente (cuando escribes un color transparente, un píxel del fotograma anterior se conserva), necesitas para hacer esto: encuentre una línea con 'graphicsControlExtensionNode.setAttribute (" disposalMethod "," none ");' y cambie '" none "' to '" restoreToBackgroundColor "' – gvlasov
Su código todavía se hace referencia en stackoverflow [4 años después] (http://stackoverflow.com/questions/16649620/is-there-a-way-to-create-one-gif-image-from-multiple-images-in-java) y planeo usarlo 7 años después:) – Aaron