Java:d​​rawImage动画gif在第一帧被冻结

时间:2014-10-21 13:51:58

标签: java image graphics awt gif

我的代码在applet中绘制我的图像,但它是一个动画gif,它在第一帧停止,好像它是一个单独的图像。

它应该是幽灵般可怕的骷髅舞,但他只是静止不动。

这是我的代码:

import java.util.*;
import java.awt.*;
import java.applet.*;
import java.net.*;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.*;

public class Spooky extends Applet
{
Image scary, trumpet, walking;
MediaTracker mt;
AudioClip spoopy;
Graphics buffer;
Image offscreen;
Dimension dim;

public void init()
{
setLayout(null);
mt = new MediaTracker(this);


mt.addImage(scary,1);
mt.addImage(trumpet,1);
mt.addImage(walking,1);
spoopy = getAudioClip(getDocumentBase(),"spoopy.wav");
spoopy.loop();
}

public void paint(Graphics g)
{
  try
{
    URL url = this.getClass().getResource("spooky.gif");
    BufferedImage img;
    img = ImageIO.read(url);
    mt.addImage(img,1);
    g.drawImage(img,0,0,300,300,this);
}
catch(IOException e)
{
}

}
}

3 个答案:

答案 0 :(得分:2)

问题是ImageIO.read(url);方法。不知道怎么,但在内部,它弄乱了gif的阅读。相反,从网址构建ImageIcon并使用getImage()的{​​{1}}获取ImageIcon

另外,请勿使用Image方法加载图像。将其加载到paint方法中。

init

答案 1 :(得分:1)

我不知道它是否有帮助,但通常这是一个问题,需要一个单独的Thread / Runnable用于动画,另一个代码用于代码。至少那是我在制作小游戏时遇到的问题。尝试这个,让我知道它是否有帮助:)

检查一下:Displaying Gif animation in java

更新:我发现的一个例子(http://examples.oreilly.com/jswing2/code/)使用支持gif的JApplet(Applet是旧的)

// AnimationApplet.java
// The classic animation applet rewritten to use an animated GIF.
//
import javax.swing.*;

public class AnimationApplet extends JApplet {
  public void init() {
    ImageIcon icon = new ImageIcon("images/rolling.gif");  // animated gif
    getContentPane().add(new JLabel(icon));
  }
}

你是否尝试不发出声音来看动画是否单独起作用?可能是声音需要单独的Runnable / Thread

答案 2 :(得分:0)

我有类似的问题。 Michail Michailidis's answer是一种解决方案。但是,如果您尝试从InputStream加载GIF(在我的情况下就是这种情况),则将需要其他解决方案。在这种情况下,我将使用Toolkit类来加载图像,更具体地说,是Toolkit#createImage(byte[])

Image image;
try(InputStream stream = this.getClass().getResourceAsStream("/someImage.gif")) {
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();

    int nRead;
    byte[] data = new byte[16384];

    while ((nRead = stream.read(data, 0, data.length)) != -1) {
        buffer.write(data, 0, nRead);
    }

    buffer.flush();

    image = Toolkit.getDefaultToolkit().createImage(buffer.toByteArray());
} catch (IOException e) {
    e.printStackTrace();
}