我有一些代码执行以下逻辑操作:
以下是一些代码片段,用于帮助演示代码正在执行的操作(为简洁起见,错误处理,文件关闭等已删除):
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透明度,或者我是否只是完全错误。任何建议将不胜感激。