2008-09-29 14 views
9

में लोड करना मैं एक जार फ़ाइल में संग्रहीत एनिमेटेड gif से ImageIcon बनाने की कोशिश कर रहा हूं।जेएआर फ़ाइल से एनिमेटेड gif को ImageIcon

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

छवि लोड होती है, लेकिन केवल एनिमेटेड gif का पहला फ्रेम होता है। एनीमेशन नहीं खेलता है।

यदि मैं फाइल सिस्टम पर एक फ़ाइल से एनिमेटेड gif लोड करता हूं, तो सब कुछ अपेक्षित काम करता है। एनीमेशन सभी फ्रेम के माध्यम से खेलता है। तो यह काम करता है:

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

मैं एक जार फ़ाइल से एक छवि आइकन में एनिमेटेड gif कैसे लोड कर सकता हूं?

संपादित करें: यहां एक पूर्ण परीक्षण केस है, यह एनीमेशन प्रदर्शित क्यों नहीं करता है?

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

उत्तर

8

यह InputStream

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

यह निश्चित उत्तर है। इस मुद्दे को कई घंटों के शोध के बाद धन्यवाद। यह ग्रहण से और जेएआरएस में मेवेन से संसाधनों को लोड करने में समस्या को हल करता है। आपका बहुत बहुत धन्यवाद! – guerda

6

आपको getClass()। GetResource (imgName) का उपयोग करना होगा; छवि फ़ाइल में एक यूआरएल प्राप्त करने के लिए। रीयल के हाउटो से this tutorial देखें।

संपादित करें: एक बार छवि लोड होने के बाद आपको एनीमेशन चलाने के लिए set the ImageObserver property पर जाना होगा।

+0

मैं कोड के पहले खंड का उपयोग कर जार फ़ाइल से ठीक पीएनजी छवियों को लोड करता हूं। और gif लोड - यह सिर्फ एनिमेटेड नहीं है। –

+0

अब मैं आपकी समस्या देखता हूं। अधिक जानकारी के लिए मेरा संपादन देखें। –

+0

ImageObserver को सेट करने से मेरे मामले में मदद नहीं मिली। ऐसा लगता है कि ImageIO एनिमेटेड gif ठीक से नहीं पढ़ रहा है। अगर मैं ImageIcon के लिए एक अलग कन्स्ट्रक्टर का उपयोग करता हूं, तो यह काम करता है। मैंने एक पूर्ण कोड उदाहरण के साथ प्रश्न अद्यतन किया। आपको अपने क्लासपाथ में एनिमेटेड.gif की आवश्यकता होगी। –

3

चूंकि यह धागा अभी एक अधिक मौजूदा धागे से जुड़ा हुआ था जो एनिमेटेड जीआईएफ के साथ बहुत कम था, लेकिन ओटी खींच लिया गया, मैंने सोचा कि मैं इस छोटे स्रोत को जोड़ूंगा जो 'मेरे लिए काम करता है'।

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

अगर किसी ने फ़ाइल से छवि को लोड करने का तरीका सोचा है, तो यहां बताया गया है: url = new URL ("file", "localhost", "resource/image.gif"); – rluks

1

से gif एनीमेशन पढ़ता है उम्मीद है कि यह इस बात के लिए भी देर नहीं हुई।

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

इस दृष्टिकोण से कुछ अंक:

मैं अपने JPanel के अंदर इस तरह ऐनिमेटेड gif पाने में कामयाब रहे
1. छवि फ़ाइल जार के भीतर है;
2. ImageIO.read() एक BufferedImage देता है, जो ImageObserver अद्यतन नहीं करता है;
3. जार फ़ाइल में बंडल की गई छवियों को ढूंढने का एक और विकल्प जावा क्लास लोडर से पूछना है, जो कोड आपके प्रोग्राम को लोड करता है, फाइलें प्राप्त करने के लिए। यह जानता है कि चीजें कहां हैं।

तो ऐसा करके मैं अपने जेपीनेल के अंदर अपना एनिमेटेड gif प्राप्त करने में सक्षम था और यह एक आकर्षण की तरह काम करता था।

संबंधित मुद्दे