2008-09-29 28 views
9

Estoy tratando de crear un ImageIcon a partir de un archivo .gif animado almacenado en un archivo jar.Cargando un archivo .GIF animado del archivo JAR en ImageIcon

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

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

Si cargo el gif animado desde un archivo en el sistema de archivos, todo funciona como se esperaba. La animación se reproduce a través de todos los cuadros. Por lo que este funciona:

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

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

EDITAR: Aquí hay un caso de prueba completo, ¿por qué 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(); 
     } 
    } 
} 

Respuesta

8

Esto lee animación GIF a partir flujoEntrada

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

Esta es la respuesta definitiva. Gracias después de investigar este problema varias horas. Esto también resuelve el problema con la carga de recursos de Eclipse y de Maven en JAR. ¡Muchas gracias! – guerda

6

Tienes que usar getClass(). GetResource (imgName); para obtener una URL para el archivo de imagen. Consulte this tutorial del Real's HowTo.

EDITAR: Una vez que se carga la imagen, tiene que set the ImageObserver property para ejecutar la animación.

+0

Cargar imágenes png muy bien desde el archivo jar utilizando la primera sección del código. Y el archivo GIF se carga, simplemente no está animado. –

+0

Veo tu problema ahora. Ver mi edición para más detalles. –

+0

configurar el ImageObserver no ayudó en mi caso. Parece que ImageIO no está leyendo correctamente el gif animado. Si utilizo un constructor diferente para ImageIcon, funciona. Actualicé la pregunta con un ejemplo de código completo. Necesitarás un animated.gif en tu classpath. –

3

Dado que este hilo se acaba de vincular a partir de un hilo más actual que tenía poco que ver con GIF animados pero se arrastró OT, pensé en agregar 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); 
    } 
} 
+0

si alguien se pregunta cómo cargar la imagen del archivo, aquí está cómo: url = new URL ("archivo", "localhost", "resources/image.gif"); – rluks

1

Esperemos que no sea demasiado tarde para esto.

me las arreglé para conseguir el gif animado dentro de mis JPanel 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 se encuentra dentro de la jarra;
2. ImageIO.read() devuelve una Imagen Buffered, que no actualiza el ImageObserver;
3. Otra alternativa para encontrar imágenes que se incluyen 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.

Al hacerlo, pude obtener mi gif animado dentro de mi JPanel y funcionó a las mil maravillas.