【发布时间】:2022-04-15 04:54:07
【问题描述】:
我有一些执行以下逻辑操作的代码:
- 使用 gif.DecodeAll 读取 gif 图像并将其解码为 *GIF
- 使用 image.Set 修改 *GIF 每一帧中的一些像素
- 使用 gif.EncodeAll 写出修改后的图像
这里有一些代码 sn-ps 来帮助演示代码在做什么(为简洁起见,删除了错误处理、文件关闭等):
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 透明度,或者我只是在做完全错误的事情。任何建议将不胜感激。
【问题讨论】:
标签: go transparency gif