Java 绘制 GIF

Posted

技术标签:

【中文标题】Java 绘制 GIF【英文标题】:Java Draw a GIF 【发布时间】:2014-01-22 08:06:21 【问题描述】:

我正在尝试使用 Java 图形 API 绘制 GIF,但我无法使用下面的代码成功绘制 GIF。仅绘制 GIF 的第一个图像或缩略图,但不播放。

public void paintComponent(Graphics g)
    super.paintComponent(g);
    BufferedImage img = null;
    try 
        URL url = new URL("GIF URL");
        img = ImageIO.read(url);
     catch (Exception e) 
           
    g.drawImage(img, 5, 5, this);

基本上我正在为登录屏幕创建图形,我想绘制一个循环的 GIF。

编辑:更新了我的代码并稍微改变了问题。

【问题讨论】:

这是an XY problem。您可能不需要绘制 gif。您需要以某种方式显示 gif。我建议避免覆盖paint,除非真的有必要。 Java Swing: how to add an image to a JPanel?的可能重复 嗯,这肯定不是重复的。 OP 想要 GIF 而不是 PNG 或 JPEG。 Why gif animation doesn't animate when using it in paintComponent()?的可能重复 @peeskillet 您的回答没有像我要求的那样循环播放或播放 GIF。我还发现这是重复的:***.com/questions/11648696/… 【参考方案1】:

您可以将 gif 加载到 BufferedImage 对象中。 然后我们将缓冲的图像绘制到您的摆动组件上

还必须更好地重写paintComponent方法

【讨论】:

【参考方案2】:

完全可以做到这一点,您只需要有一个正确的方法来加载图像的帧。我用来做这个的代码是这样的:

private static Image load(final String url) 
    try 
        final Toolkit tk = Toolkit.getDefaultToolkit();
        final URL path = new URL(url); // Any URL would work here
        final Image img = tk.createImage(path);
        tk.prepareImage(img, -1, -1, null);
        return img;
     catch (Exception e) 
        e.printStackTrace();
        return null;
    

这使用 Toolkit 加载 gif 图像,因为如果我没记错的话,ImageIO 目前无法正确加载 gif。

从那里开始,只需在(例如)JPanel 中执行以下操作:

@Override
protected void paintComponent(Graphics g)
    super.paintComponent(g); // clear up render
    //...
    g.drawImage(IMAGE, x, y, this); // ImageObserver necessary here to update
    //...


例子:

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

public class GifAnimation 

    public GifAnimation()
        JFrame frame = new JFrame("Gif Animation");
        GifPanel panel = new GifPanel(load("http://www.thisiscolossal.com/wp-content/uploads/2013/01/3.gif"));
        frame.add(panel);
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    

    private static Image load(final String url) 
        try 
            final Toolkit tk = Toolkit.getDefaultToolkit();
            final Image img = tk.createImage(new URL(url));
            tk.prepareImage(img, -1, -1, null);
            return img;
         catch (Exception e) 
            e.printStackTrace();
            return null;
        
    

    public static void main(String[] args)
        EventQueue.invokeLater(new Runnable() 
            public void run() 
                new GifAnimation();
            
        
    

    public class GifPanel extends JPanel 

        private final Image image;

        public GifPanel(Image image)
            this.image = image;
        

        @Override
        protected void paintComponent(Graphics g)
            super.paintComponent(g);
            g.drawImage(image, 10, 10, this);
        

        @Override
       public Dimension getPreferredSize()
            return new Dimension(660, 660);
        

    


【讨论】:

【参考方案3】:

使用JPanel的paint方法不能直接实现GIF动画。

我建议您在面板中插入一个 JEditorPane,只要您想显示它并使用 html 在其中显示 GIF。 参考showing images on jeditorpane (java swing)

虽然有些人可能会批评它是一种粗鲁的方式,但动画效果很好。

希望这会有所帮助。

【讨论】:

以上是关于Java 绘制 GIF的主要内容,如果未能解决你的问题,请参考以下文章

JFrame 绘制带有 alpha 通道的动画 gif 图像

MATLAB中绘制质点轨迹动图并保存成GIF

使用 css 信息绘制多个 gif 文件

总结-绘制直方图GIF动态图

总结-Python绘制直方图GIF动态图

在 R 中绘制 3D GIF