具有透明背景的gif问题

问题描述 投票:0回答:2

我在以透明背景显示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);
}

}
java graphics awt gif transparent
2个回答
0
投票

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

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

0
投票

这里是另一个How to fix .gif with corrupted alpha channel (stuck pixels) collected with Graphicsmagick?

您的gif为disposal = 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

所以这里有2种可能的作用:

  1. 透明度

    也许应该将其作为具有背景的透明图像来处理,但是即使是体面的图像查看器(如FastStone Image Viewer)也可以显示相同的内容,所以我怀疑情况确实如此...

  2. 扩展名

    这是最可能的原因。如今,WEB褐变(依赖数年之久)依赖于添加到GIF扩展包中的未记录的定制扩展(而不是任何GIF规范的一部分),并且在呈现的某些方面(例如循环)完全忽略了GIF文件格式。仅仅是因为它们所有人都使用相同的图像库来解码GIF,而这些代码却被错误地编码(或设计使然)...

    有关更多信息,请参见:

    因此,我猜您的GIF中有一些扩展数据包,它告诉Brownser使用与GIF标头中存储的方法不同的处置方法。因此,您的GIF只是有错误,只有有错误的GIF解码器才能正确呈现它...

所以您的解码器会忽略GIF的背景颜色,因此无法正确渲染,因为增量渲染不适用于非黑色背景...

是的,那些白线之间有间隙...它不是混叠...

© www.soinside.com 2019 - 2024. All rights reserved.