gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:17:52 25 4
gpt4 key购买 nike

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

  • 使用 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
}

和修改_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 透明度,或者我是否只是做错了事情。任何建议将不胜感激。

最佳答案

这在生成 gif 的各种 golang 教程中经常被忽略或没有涉及,但是随着为 Image slice 中的每个帧设置延迟 Delay slice ,它是也可选择为 gif 的每一帧设置 DisposalDisposalNone 用于 slice 没有对应于当前帧索引的成员。

处置选项是:

const (
DisposalNone = 0x01 // dont dispose of previous frames
DisposalBackground = 0x02 // dispose of specific colour in previous frames defined by GIF.BackgroundIndex
DisposalPrevious = 0x03 // dispose of the previous frame
)

以下是每种处理类型的结果 gif。

处置无: gif.DisposalNone

处置背景: gif.DisposalBackground

处置上一个: gif.DisposalPrevious

关于go - 在 go 中修改 gif 图像...未正确设置透明度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20873955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com