在go ...中修改gif图像没有正确设置透明度

时间:2014-01-01 22:28:55

标签: go transparency gif

我有一些代码执行以下逻辑操作:

  • 使用gif.DecodeAll
  • 读入gif图像并将其解码为* GIF
  • 使用image.Set
  • 修改* GIF每帧中的一些像素
  • 使用gif.EncodeAll
  • 写出生成的修改后的图像

以下是一些代码片段,用于帮助演示代码正在执行的操作(为简洁起见,错误处理,文件关闭等已删除):

f, err := os.Open(filename)
reader := bufio.NewReader(f)
g, err := gif.DecodeAll(reader)
err = modify_image(g)

of, err := os.Create("out.gif")
writer := bufio.NewWriter(of)
err = gif.EncodeAll(writer, g)

这是modify_image函数:

func modify_image(img *gif.GIF) error {
    for i := 0; i < len(img.Image); i++ {
        err := modify_frame(img.Image[i])
    }
    return nil
}

并且modify_frame:

func modify_frame(frame *image.Paletted) error {
    xmin := frame.Rect.Min.X
    ymin := frame.Rect.Min.Y
    xmax := frame.Rect.Max.X
    ymax := frame.Rect.Max.Y

    for y := ymin; y < ymax; y++ {
        for x := xmin; x < xmax; x++ {
            if should_turn_pixel_transparent(frame, x, y) {
                frame.Set(x, y, color.RGBA64{0, 0, 0, 0})
            }
        }
    }
    return nil
}

此代码生成的out.gif具有正确的像素变为透明,但随着动画的进行,我变为透明的像素不是“清除”;即,当这些透明像素被写在非透明像素上时,仍然会显示下面的非透明像素。

我(简要)的理解是,有两种不同的方法来表示GIF中的透明度。我不知道我是否需要使用索引透明度与alpha透明度,或者我是否只是完全错误。任何建议将不胜感激。

0 个答案:

没有答案