【问题标题】:Java: drawImage animated gif is frozen on first frameJava:d​​rawImage动画gif在第一帧被冻结
【发布时间】:2014-12-16 18:41:29
【问题描述】:

我得到了在小程序中绘制图像的代码,但它是一个动画 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)
{
}

}
}

【问题讨论】:

标签: java image graphics awt gif


【解决方案1】:

问题在于ImageIO.read(url); 方法。不知道如何,但在内部,它弄乱了 gif 的阅读。相反,从 URL 构造一个ImageIcon 并使用ImageIcongetImage() 来获取Image

顺便说一句,不要在paint 方法中加载图像。在init 方法中加载它。

public class Spooky extends Applet {
    Image image;

    public void init() {
        URL url = this.getClass().getResource("spooky.gif");
        image = new ImageIcon(url).getImage();
    }

    public void paint(Graphics g) {
        super.paint(g);
        g.drawImage(image, 0, 0, 300, 300, this);
    }  
}

【讨论】:

  • 您的方法出现错误“不兼容的类型”。可能是因为我使用的是 BufferedImage 而不是 Image?
  • 是的,getImage() 不会返回 BufferedImage
  • 你知道我怎样才能让它与 BufferedImage 一起工作吗?我不喜欢常规图像的闪烁。
  • @RyanDwyer From java.net/node/683927 "你可以试试,但它只会将 GIF 的“当前”帧绘制到 BufferedImage。BufferedImage 对象只是静态的像素桶,所以它们不能"动画“。”
  • Welp 我想我使用的是常规图像。感谢您的帮助!
【解决方案2】:

我不知道它是否有帮助,但通常这是一个问题,即动画需要单独的 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

【讨论】:

  • 如果我对 JFrame 有很多了解,那将会很有帮助。对不起。
  • JFrame 无关紧要 - 请参阅内部资料 ;) - 请检查我的更新
  • 这对普通图像非常有用,但你知道我如何让它与 BufferedImage 一起使用吗?
  • 正如我在上面的同一条评论中所说:@RyanDwyer From java.net/node/683927“你可以尝试,但它只会将 GIF 的“当前”帧绘制到 BufferedImage。BufferedImage 对象只是静态的像素桶,因此它们无法“动画化”。”
【解决方案3】:

我遇到了类似的问题。 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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-04
    • 2010-12-20
    • 2013-06-24
    • 2015-04-28
    • 1970-01-01
    • 2016-08-03
    相关资源
    最近更新 更多