透明背景gif的问题
Problem with gif with transparent background
我在用透明背景显示我的 gif 时遇到问题,因为当我启动这个程序时,我的 gif 显示了,但 gif 的所有图片都留在了 canvas。请问有人知道解决办法吗?
这是我的代码:
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);
}
这里还有一个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";
当我用解码器渲染它时,它看起来像这样:
[![捕获][1]][1]
所以这里有两种可能的事情:
- 透明度
也许这应该作为带背景的透明图像处理,但即使是体面的图像查看器(如 FastStone Image Viewer)也会显示相同的东西,所以我怀疑情况是否如此...
- 扩展
这是最有可能的原因。现在的 WEB 浏览器(几年了)依赖于添加到 GIF 扩展数据包(而不是任何 GIF 规范的一部分)的未记录的自定义扩展,并且在渲染的某些方面(如循环)完全忽略 GIF 文件格式。仅仅是因为它们都使用相同的图像库来解码 GIF,而这些 GIF 编码很糟糕(或故意)...
有关详细信息,请参阅:
所以我猜你的 GIF 有一些扩展包告诉 brownser 使用与 GIF header 中存储的不同的处理方法。所以很简单,你的 GIF 有问题,只有有问题的 GIF 解码器才能正确渲染它...
因此您的解码器忽略了 GIF 的背景颜色,因此渲染不正确,因为增量渲染不适用于非黑色背景...
是的,那些白线是有间隙的……它不是锯齿……
[1]: https://i.stack.imgur.com/6Kbbp.gif
我在用透明背景显示我的 gif 时遇到问题,因为当我启动这个程序时,我的 gif 显示了,但 gif 的所有图片都留在了 canvas。请问有人知道解决办法吗?
这是我的代码:
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);
}
这里还有一个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";
当我用解码器渲染它时,它看起来像这样:
[![捕获][1]][1]
所以这里有两种可能的事情:
- 透明度
也许这应该作为带背景的透明图像处理,但即使是体面的图像查看器(如 FastStone Image Viewer)也会显示相同的东西,所以我怀疑情况是否如此...
- 扩展
这是最有可能的原因。现在的 WEB 浏览器(几年了)依赖于添加到 GIF 扩展数据包(而不是任何 GIF 规范的一部分)的未记录的自定义扩展,并且在渲染的某些方面(如循环)完全忽略 GIF 文件格式。仅仅是因为它们都使用相同的图像库来解码 GIF,而这些 GIF 编码很糟糕(或故意)...
有关详细信息,请参阅:
所以我猜你的 GIF 有一些扩展包告诉 brownser 使用与 GIF header 中存储的不同的处理方法。所以很简单,你的 GIF 有问题,只有有问题的 GIF 解码器才能正确渲染它...
因此您的解码器忽略了 GIF 的背景颜色,因此渲染不正确,因为增量渲染不适用于非黑色背景...
是的,那些白线是有间隙的……它不是锯齿…… [1]: https://i.stack.imgur.com/6Kbbp.gif