Java 透明背景的gif有问题

Java 透明背景的gif有问题,java,graphics,awt,gif,transparent,Java,Graphics,Awt,Gif,Transparent,我在使用透明背景显示gif时遇到问题,因为当我启动此程序时,gif会显示,但gif的所有图片都保留在画布上。有人知道一些解决办法吗 这是我的代码: package zkouska3; import java.awt.Graphics; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.URL; import javax.swing.I

我在使用透明背景显示gif时遇到问题,因为当我启动此程序时,gif会显示,但gif的所有图片都保留在画布上。有人知道一些解决办法吗

这是我的代码:

package zkouska3;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JFrame;

public class mainl extends JFrame{
    private Image TestImage;

    private BufferedImage bf;

    public static void main(String[] args) {
        new mainl();
    }

    public mainl() {
        setSize(500, 500);
        imageLoader();
        setVisible(true);
    }
    public void imageLoader() {
        try {
            TestImage = new ImageIcon(this.getClass().getResource("pandulak.gif")).getImage();
        }catch(Exception e) {

        }
    }
    @Override
    public void paint(Graphics g){
         g.drawImage(TestImage, 0, 0, 300, 300, this);
}

}

您已经覆盖了
JFrame
中的
paint
方法。这意味着
JFrame
本身不再被绘制(或者更简单地说,图像的背景永远不会被绘制)。在上面绘制图像的
paint
方法中插入对
super.paint(g)
的调用,以便每次新的gif图像显示时,背景都会绘制到上一个gif图像上:

@Override
public void paint(Graphics g) {
    super.paint(g);
    g.drawImage(TestImage, 0, 0, 300, 300, this);
}
这是另一个

您的gif是
disposition=3
,这意味着它在增量渲染时需要上一幅图像。问题是图像背景是黑色而不是白色

以下是可能的处置:

     if (disposal==0) s="no animation";
else if (disposal==1) s="leave image as is";
else if (disposal==2) s="clear with background";
else if (disposal==3) s="restore previous image";
else                  s="reserved";
当我使用解码器渲染它时,它看起来如下所示:

[![capture][1]][1]

因此,这里有两个可能的因素:

  • 透明度
  • 也许这应该作为透明的背景图像处理,但即使是像样的图像查看器(如FastStone图像查看器)也会显示相同的内容,所以我怀疑情况是否如此

  • 扩展名
  • 这是最可能的原因。现在的WEB浏览器(几年前)依赖于添加到GIF扩展包(而不是任何GIF规范的一部分)中的未记录的自定义扩展,在渲染的某些方面(如循环)完全忽略GIF文件格式。这仅仅是因为它们都使用相同的图像库来解码GIF,而GIF的编码很糟糕(或者是设计的)

    有关更多信息,请参阅:

    所以我猜你的GIF有一些扩展包告诉brownser使用不同的处理方法,而不是GIF头中存储的方法。所以你的GIF是有缺陷的,只有有缺陷的GIF解码器才能正确地呈现它

    因此,解码器会忽略GIF的背景色,因此渲染不正确,因为增量渲染不适用于非黑色背景

    是的,那些白线是有间隙的。。。它不是别名。。。
    [1] :

    我的猜测是,您必须使用“dispose方法”,它基本上告诉gif渲染器在每个帧之间应该做什么(以增量方式添加或清除它们)。您可以查看,我刚刚在本地尝试了这两种情况,通过您的代码+我的修改,它可以按预期工作(使用透明背景的.gif)。我还重现了您在不调用
    super.paint(g)时遇到的问题