如何在 gif 中为 BufferedImage 创建透明像素,然后保存到 GIF 文件?

How to create transparent pixels in a gif for BufferedImage, then save to a GIF file?

提问人:davidalayachew 提问时间:9/21/2023 最后编辑:davidalayachew 更新时间:9/21/2023 访问量:36

问:

我有代码可以创建一个简单的 java.awt.Color 的 5x5 数组,然后使用它来创建 java.awt.image.BufferedImage。数组的边缘是一种不透明的颜色(),称为 ,而中心是一种透明的颜色(),称为 。alpha = 255oalpha = 0t

最后,我使用 javax.imageio.ImageIO.write() 将图像写出到文件中。

这是代码。

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

class Irrelevant
{

   public static void main(String[] args) throws Exception
   {
   
      final Color o = new Color(255, 0, 0, 255); //opaque red
      final Color t = new Color(0, 255, 0, 0);   //transparent green -- clear
   
      final Color[][] pixels = //red edges with (ideally) a clear center
         {
            {o, t, t, t, o},
            {o, t, t, t, o},
            {o, t, t, t, o},
            {o, t, t, t, o},
            {o, t, t, t, o}
         };
   
      BufferedImage image = new BufferedImage(pixels.length, pixels[0].length, BufferedImage.TYPE_INT_ARGB);
   
      for (int y = 0; y < pixels.length; y++)
      {
         for (int x = 0; x < pixels[y].length; x++)
         {
            image.setRGB(x, y, pixels[y][x].getRGB());
         }
      }
   
      ImageIO.write(image, "gif", new File("abctest.gif"));
      ImageIO.write(image, "png", new File("abctest.png"));
   
   }

}

但是,这是生成的 gif。我用紫色背景显示它,以表明图像在中心不是透明的,就像预期的那样。它实际上是黑色的。

不要介意模糊,那是 IrfanView 很烦人。

enter image description here

这是Microsoft Paint中的另一个。相同的gif。

enter image description here

为什么它们在中心不清楚?我知道我设置正确,因为请记住,我还将其保存为 png 和 gif。当我将其保存为 png 时,它会按预期工作。这是 png 的屏幕截图。alpha

enter image description here

enter image description here

有人能帮我指明正确的方向吗?

编辑 - 这是我没有制作的示例图像。

enter image description here

在 IrfanView 中,它看起来像这样。

enter image description here

在这个 gif 中,紫色正确显示,这就是让我失望的原因。

但多亏了@camickr的帮助,我开始认为这实际上只发生在 IrfanView 上,因为我通过它查看的所有其他图像查看器都有效。这包括照片、截图工具、LibreOffice Draw 和 Firefox。在渲染时,它们都显示白色(或背景特定颜色),这意味着它实际上是透明的。

Java 图像 透明度 GIF 不透明度

评论

1赞 MadProgrammer 9/21/2023
似乎对我来说工作得很好
2赞 camickr 9/21/2023
当我使用Paint时,我得到的结果和你一样。我尝试对两种颜色使用颜色选择器。但是,没有显示 alpha 值,所以我不知道 Paint 正在读取什么。我确实尝试使用 JLabel 和 StretchIcon(来自我的博客)创建一个简单的 GUI 来显示每个图像。两者在画面中都显示为透明。
1赞 camickr 9/21/2023
另外,请注意,在 Paint 中,png 的“透明”颜色是 (255, 255, 255),但 gif 的颜色是 (0, 0, 0)。不知道是什么意思,只是一个观察。
1赞 camickr 9/21/2023
我是 Windows 11。MadProgrammer 是 Mac。
1赞 camickr 9/21/2023
玩得更多,我发现它有一个“背景透明度”工具。当我使用该工具时,我绘制的区域也变成了黑色。然后,我在我的 GUi 中重新测试了图像,它确实显示为透明。因此,您在“画图”中看到的黑色似乎是它显示透明部分的方式,因为默认情况下背景是白色的。查看油漆的“图像”部分,然后单击图像部分左侧区域中矩形的下拉箭头。

答: 暂无答案