我试图用动画gif替换我的代码中的BufferedImage

时间:2014-03-20 18:32:46

标签: java swing animation drawimage imageobserver

目前在我的代码中我有一个像:

这样的BufferedImage
Graphics2D g2d = (Graphics2D) g;
g2d.transform(at); //at is an AffineTransform that just rotates the .gif
g2d.drawImage(sharkie, xCenter-5*radius, yCenter-3*radius, 10*radius, 6*radius, null);

我已经将它完全用作BufferedImage,但正如预期的那样它只显示第一帧。我想知道是否有人知道一种类似于BufferedImage的方式,它适用于GIF动画。我似乎无法使用将其添加到JButton的技术。我也无法弄清楚是否有一个可行的ImageObserver可以在drawImage()调用中为.gif设置动画。

我愿意尝试任何事情,但我最感兴趣的是可以使用ImageObserver进行绘制调用,因为这只会是一个很小的变化。

谢谢大家!

1 个答案:

答案 0 :(得分:0)

  

“我已经将它完全用作BufferedImage,但正如预期的那样只显示第一帧”

尝试使用ImageIO.read(...)读取图像时会发生这种情况。如果你用new ImageIcon(...).getImage()阅读它,你将获得gif动画。请参阅here

  

“我也无法弄清楚是否有一个可行的ImageObserver会在drawImage()调用中为.gif设置动画。”

ImageObserver是您正在绘制的组件。因此,您应该使用drawImage(..., null)

,而不是使用drawImage(..., this)
  

“我愿意尝试任何事情,但我最感兴趣的是可以使用ImageObserver进行绘制调用,因为这只会是一个很小的改变。”

结合上面两点,你得到了答案。


将此代码作为测试运行。从this answer

获取的gif图像
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class TestGif {

    public TestGif() {
        JFrame frame = new JFrame();
        frame.add(new GifPanel());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public class GifPanel extends JPanel {
        Image image;
        {
            try {
                image = new ImageIcon(new URL("http://i.stack.imgur.com/lKfdp.gif")).getImage();
            } catch (MalformedURLException ex) {
                Logger.getLogger(TestGif.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(image, 0, 0, this);
        }
        @Override
        public Dimension getPreferredSize() {
            return image == null ? new Dimension(200, 200) 
                    : new Dimension(image.getWidth(this), image.getHeight(this));
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TestGif();
            }
        });
    }
}