Gif 没有在 JFrame 中播放

Posted

技术标签:

【中文标题】Gif 没有在 JFrame 中播放【英文标题】:Gif not playing in JFrame 【发布时间】:2014-12-15 23:34:04 【问题描述】:

您好,我在 JFrame 中有一个 gif。一切都很好,只是第一次冻结 gif 就好像它是 jpeg 或 png。

此外,*** 告诉我我需要添加更多详细信息,即使我已经添加了陈述我的问题所需的所有详细信息,所以请随意忽略这一点。

代码如下:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;

 public class LoadImageApp extends Component 

BufferedImage img;

public void paint(Graphics g) 
    g.drawImage(img, 0, 0, this);


public LoadImageApp() 
    try 
       img = ImageIO.read(new File("spooky.gif"));
    catch (IOException e) 
   



public Dimension getPreferredSize() 
    if (img == null) 
         return new Dimension(100,100);
     else 
       return new Dimension(img.getWidth(null), img.getHeight(null));
   


public static void main(String[] args) 

    JFrame f = new JFrame("Load Image Sample");

    f.addWindowListener(new WindowAdapter()
            public void windowClosing(WindowEvent e) 
                System.exit(0);
            
        );

    f.add(new LoadImageApp());
    f.pack();
    f.setVisible(true);

【问题讨论】:

我认为它是动画 GIF? 【参考方案1】:

我很确定 ImageIO 在动画 gif 方面存在一些问题。

尝试使用JLabel 和图标,如下所示:

Icon icon = new ImageIcon(filename);
JLabel gif = new JLabel(icon);

JFrame f = new JFrame("Load Image Sample");

f.addWindowListener(new WindowAdapter()
        public void windowClosing(WindowEvent e) 
            System.exit(0);
        
    );

f.getContentPane().add(gif);
f.pack();
f.setVisible(true);

【讨论】:

您还可以从ImageIcon.getImage() 获得一个Image 来进行绘画,如here 和here 所示。或者,如果您必须使用BufferedImage,您可以从@MadProgrammer 关注these crazy instructions :-) f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);替换windowListener 恐怕这个选项不起作用,我已经尝试过 JLabel,这里的问题是某些 gif 在 java 程序中不起作用,我提出赏金是因为我想要弄清楚为什么有些 gif 可以在某些 Java 程序中工作,而另一些却不能,即使我们知道它们可以在其他程序或语言中工作 不如让我解释一下我的问题,它确实解决了使 gif 动画制作的原始问题,但是现在图像到处都是静态的乱码,实际上并没有多大帮助。也许你可以编辑你的答案来处理这个问题?如果您需要我使用的参考 gif,它是 camo.githubusercontent.com/…【参考方案2】:

如前所述,ImageIO 不会正确加载动画 GIF 的所有帧。但是Toolkit 方法之一会。例如

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

// Ach AWT!
//public class LoadImageApp extends Component 
public class LoadImageApp extends JPanel 

    Image img;

    // should be paintComponent for a JComponent
    //public void paint(Graphics g) 
    public void paintComponent(Graphics g) 
        super.paintComponent(g); // call super method first
        g.drawImage(img, 0, 0, this);
    

    public LoadImageApp() 
        setBackground(Color.BLUE.darker().darker());
        try 
            URL url = new URL("http://i.stack.imgur.com/OtTIY.gif");
            // as mentioned, ImageIO will not load animated GIFs correctly.
            //img = ImageIO.read(url));
            // but the toolkit method will, OTOH..
            img = Toolkit.getDefaultToolkit().createImage(url);
            // ..we need a MediaTracker
            MediaTracker mt = new MediaTracker(this);
            mt.addImage(img, 0);
            mt.waitForAll();
         catch (Exception e) 
            e.printStackTrace();
        
    

    public Dimension getPreferredSize() 
        if (img == null) 
            return new Dimension(100, 100);
         else 
            return new Dimension(img.getWidth(this), img.getHeight(this));
        
    

    public static void main(String[] args) 
        // should be donw on the EDT - BNI
        JFrame f = new JFrame("Load Image Sample");
        f.add(new LoadImageApp());
        f.pack();
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    

如需进一步讨论,请参阅Show an animated BG in Swing。

【讨论】:

汤普森先生的杰作!赏金奖励时间限制一开启,50 个就是你的了!现在也许你可以多解释一下?我自己正在尝试理解为什么一个选项有效而另一个无效... 或者你可以买一台 Mac,在它上面动画 gif 似乎“正常工作”。本人在another question @DreadHeadedDeveloper “现在也许你可以多解释一下?” 我能得到的最好的解释是对链接问题的接受答案! (我真的不明白 为什么 ImageIO 应该 fail 正确加载动画 GIF。)

以上是关于Gif 没有在 JFrame 中播放的主要内容,如果未能解决你的问题,请参考以下文章

JavaFX GIF 没有播放完整的 GIF

在 JFrame 窗口的背景中播放音乐

解决React Native的Android端gif图片显示以及只播放一次的问题

使用 Tkinter 在 GIF 中播放动画 [重复]

如何从 url 在 android 中播放 gif?

在android中播放下载的Gif图像