【问题标题】:Java Draw a GIFJava 绘制 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。

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

【问题讨论】:

标签: java swing jpanel gif paintcomponent


【解决方案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)

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

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2014-04-10
        • 2021-07-18
        • 1970-01-01
        • 2014-12-07
        • 2022-06-22
        • 2022-12-03
        • 2021-07-15
        • 1970-01-01
        相关资源
        最近更新 更多