【问题标题】:Modifying a gif image in go...not setting transparency correctly在 go 中修改 gif 图像...未正确设置透明度
【发布时间】: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


    【解决方案1】:

    这在用于生成 gif 的各种 golang 教程中经常被忽略或未涵盖,但除了为 Image 切片中的每一帧设置延迟 Delay 切片外,还可以选择为每一帧设置 Disposal的 gif。 DisposalNone 用于切片没有对应当前帧索引的成员。

    处置选项是:

    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。

    处置无:

    处置背景:

    处置上一个:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 2010-11-09
      • 1970-01-01
      相关资源
      最近更新 更多