使用Golang从PNG图像创建GIF动画。

4

我正在尝试从PNG图像创建GIF动画,但是生成的动画有彩色噪点。屏幕截图:https://prnt.sc/22rrrfn

我曾尝试更改Pallete.Plan9,因为256种颜色可能不够用,但是没有得到好的结果。

func test() error {
    fmt.Printf("Generating GIF")
    files, err := ioutil.ReadDir("text")
    if err != nil {
        log.Fatal(err)
    }
    var filenames []string
    for _, file := range files {
        filenames = append(filenames, file.Name())
    }

    anim := gif.GIF{LoopCount: len(filenames)}
    fmt.Println(anim.LoopCount)
    for _, filename := range filenames {
        reader, err := os.Open("text/" + filename)
        if err != nil {
            fmt.Println("Error Open dir")
        }
        defer reader.Close()

        img, err := png.Decode(reader)
        if err != nil {
            fmt.Println("Error Decode")
        }
        bounds := img.Bounds()
        drawer := draw.FloydSteinberg

        palettedImg := image.NewPaletted(bounds, palette.Plan9)

        drawer.Draw(palettedImg, img.Bounds(), img, image.ZP)
        anim.Image = append(anim.Image, palettedImg)
        anim.Delay = append(anim.Delay, 0)
    }
    output := fmt.Sprintf("FINAL.gif")
    file, err := os.Create(output)
    defer file.Close()
    if err != nil {
        fmt.Println("Error create file")
    }
    encodeErr := gif.EncodeAll(file, &anim)
    if encodeErr != nil {
        return fmt.Errorf("Unable to create file %s: %v", err)
    }
    return nil
}

我做错了什么?请帮我

1个回答

1

嗯,不太确定,但drawer := draw.FloydSteinberg使用了 Floyd-Steinberg 抖动算法,可能是导致这些伪影的原因。您试过只使用draw.Draw吗?

建议更改为:

drawer := draw.FloydSteinberg

palettedImg:= image.NewPaletted(bounds, palette.Plan9)

drawer.Draw(palettedImg,img.Bounds(),img,image.ZP)

使用这个:

palettedImg:= image.NewPaletted(bounds, palette.Plan9)

draw.Draw(palettedImg,img.Bounds(),img,image.ZP)

然后看看它看起来是什么样子。


draw.Draw(palettedImg,img.Bounds(),img,image.ZP) - 参数不足。我尝试了 draw.Draw(palettedImg,img.Bounds(),img,image.ZP, draw.Src),没有点,但是颜色不够丰富,渐变效果也很糟糕 https://prnt.sc/22s5lwh - frostrock777
Floyd-Steinberg会产生瑕疵,但图像颜色良好且没有渐变问题。唯一的问题是点的数量。 也许我可以使用另一种方法而不是Floyd-Steinberg,但我不知道该用什么替代方法。 - frostrock777

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接