Pregunta

Estoy intentando crear un ImageIcon a partir de un gif animado almacenado en un archivo jar.

ImageIcon imageIcon = new ImageIcon(ImageIO.read(MyClass.class.getClassLoader().getResourceAsStream("animated.gif")));

La imagen se carga, pero solo el primer fotograma del gif animado. La animación no se reproduce.

Si carga el gif animado de un archivo en el sistema de archivos, todo funciona como se espera. La animación se reproduce a través de todos los cuadros. Así que esto funciona:

ImageIcon imageIcon = new ImageIcon("/path/on/filesystem/animated.gif");

¿Cómo puedo cargar un gif animado en un ImageIcon desde un archivo jar?

EDITAR: Aquí hay un caso de prueba completo, ¿por qué esto no muestra la animación?

import javax.imageio.ImageIO;
import javax.swing.*;

public class AnimationTest extends JFrame {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                AnimationTest test = new AnimationTest();
                test.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                test.setVisible(true);
            }
        });
    }

    public AnimationTest() {
        super();
        try {
            JLabel label = new JLabel();
            ImageIcon imageIcon = new ImageIcon(ImageIO.read(AnimationTest.class.getClassLoader().getResourceAsStream("animated.gif")));
            label.setIcon(imageIcon);
            imageIcon.setImageObserver(label);
            add(label);
            pack();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
¿Fue útil?

Solución

Esto lee la animación gif de inputStream

InputStream in = ...;
Image image = Toolkit.getDefaultToolkit().createImage(org.apache.commons.io.IOUtils.toByteArray(in));

Otros consejos

Tienes que usar getClass (). getResource (imgName); para obtener una URL para el archivo de imagen. Echa un vistazo a este tutorial de Real's HowTo.

EDITAR: una vez que se haya cargado la imagen, debe < configura la propiedad ImageObserver para que la animación se ejecute.

Dado que este hilo solo se vinculó desde un hilo más actual que tenía poco que ver con GIF animados pero que se me arrastró OT, pensé que agregaría esta fuente trivial que "funciona para mí".

import javax.swing.*;
import java.net.URL;

class AnimatedGifInLabel {

    public static void main(String[] args) throws Exception {
        final URL url = new URL("http://i.stack.imgur.com/OtTIY.gif");
        Runnable r = new Runnable() {
            public void run() {
                ImageIcon ii = new ImageIcon(url);
                JLabel label = new JLabel(ii);
                JOptionPane.showMessageDialog(null, label);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

Esperemos que no sea demasiado tarde para esto.

Me las arreglé para obtener el gif animado dentro de mi JPanel de esta manera:

private JPanel loadingPanel() {
    JPanel panel = new JPanel();
    BoxLayout layoutMgr = new BoxLayout(panel, BoxLayout.PAGE_AXIS);
    panel.setLayout(layoutMgr);

    ClassLoader cldr = this.getClass().getClassLoader();
    java.net.URL imageURL   = cldr.getResource("img/spinner.gif");
    ImageIcon imageIcon = new ImageIcon(imageURL);
    JLabel iconLabel = new JLabel();
    iconLabel.setIcon(imageIcon);
    imageIcon.setImageObserver(iconLabel);

    JLabel label = new JLabel("Loading...");
    panel.add(iconLabel);
    panel.add(label);
    return panel;
}

Algunos puntos de este enfoque:
1. El archivo de imagen está dentro del jar; 2. ImageIO.read () devuelve una BufferedImage, que no actualiza ImageObserver; 3. Otra alternativa para encontrar imágenes que están agrupadas en el archivo jar es pedirle al cargador de clases de Java, el código que cargó su programa, que obtenga los archivos. Sabe dónde están las cosas.

Así que al hacer esto pude obtener mi gif animado dentro de mi JPanel y funcionó a la perfección.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top