我在以透明背景显示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);
}
}
答案 0 :(得分: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);
}
答案 1 :(得分: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";
当我用解码器渲染它时,它看起来像这样:
所以这里有2种可能的作用:
透明度
也许这应该被当作带有背景的透明图像来处理,但是即使是体面的图像查看器(例如FastStone Image Viewer)也可以显示相同的内容,所以我怀疑情况是否如此……
扩展
这是最可能的原因。如今,WEB褐变(依赖几年)依赖于添加到GIF扩展包中的未记录的定制扩展(而不是任何GIF规范的一部分),并且在渲染的某些方面(如循环)完全忽略了GIF文件格式。仅仅是因为它们所有人都使用相同的图像库来解码GIF,而这些代码却被错误地编码(或设计使然)...
有关更多信息,请参见:
所以我的猜测是您的GIF中有一些扩展数据包,它告诉brownser使用不同于GIF标头中存储的处理方法。因此,简单来说,您的GIF就是错误的,只有错误的GIF解码器才能正确呈现它...
因此,您的解码器会忽略GIF的背景色,因此无法进行正确渲染,因为增量渲染不适用于非黑色背景...
是的,那些白线之间有间隙...它不是混叠...