2008-09-29 13 views
9

Próbuję utworzyć obraz ImageIcon z animowanego gif zapisanego w pliku jar.Ładowanie animowanego gif z pliku JAR do ImageIcon

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

Obraz jest ładowany, ale tylko pierwsza klatka animowanego gifa. Animacja nie jest odtwarzana.

Po załadowaniu animowanego gif z pliku w systemie plików wszystko działa zgodnie z oczekiwaniami. Animacja odtwarza wszystkie klatki. To działa:

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

Jak mogę załadować animowany gif do ImageIcon z pliku JAR?

EDYCJA: Oto kompletny przypadek testowy, dlaczego to nie wyświetla animacji?

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(); 
     } 
    } 
} 

Odpowiedz

8

Odczytuje animacji GIF z InputStream

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

To jest określona odpowiedź. Dziękuję po zbadaniu tego problemu kilka godzin. Rozwiązuje to również problem z ładowaniem zasobów z Eclipse i z Maven w plikach JAR. Wielkie dzięki! – guerda

6

Musisz użyć getClass(). GetResource (imgName); aby uzyskać adres URL do pliku obrazu. Sprawdź numer this tutorial od Real's HowTo.

EDYCJA: Po załadowaniu obrazu musisz wykonać set the ImageObserver property, aby uruchomić animację.

+0

Ładuję obrazy PNG z pliku JAR za pomocą pierwszej sekcji kodu. A ładunki gif - po prostu nie są animowane. –

+0

Widzę teraz twój problem. Zobacz moją edycję po więcej szczegółów. –

+0

Ustawienie ImageObserver nie pomogło w moim przypadku. Wygląda na to, że ImageIO nie czyta poprawnie animowanego gifa. Jeśli użyję innego konstruktora dla ImageIcon, to działa. Zaktualizowałem pytanie z pełnym przykładem kodu. Będziesz potrzebował animated.gif w swojej ścieżce klas. –

3

Ponieważ ten wątek był po prostu połączony z bardziej aktualnym wątkiem, który miał niewiele wspólnego z animowanymi GIF-ami, ale został przeciągnięty, pomyślałem, że dodaję to banalne źródło, które "działa dla mnie".

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

Jeśli ktoś zastanawiał się, jak załadować obraz z pliku, oto jak: url = nowy adres URL ("plik", "localhost", "resources/image.gif"); – rluks

1

Mam nadzieję, że to nie jest zbyt późno na to.

udało mi się uzyskać animowany gif wewnątrz moich JPanel w ten sposób:

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; 
} 

niektóre punkty tego podejścia:
1. Plik obrazu jest w słoiku;
2. ImageIO.read() zwraca obraz BufferedImage, który nie aktualizuje ImageObserver;
3. Inną alternatywą dla znajdowania obrazów dołączonych do pliku JAR jest pobranie programu ładującego klasy Java, kodu, który załadował program, w celu pobrania plików. Wie, gdzie są rzeczy.

W ten sposób udało mi się uzyskać animowany gif w moim JPanelu i zadziałało jak czar.

Powiązane problemy