golang 多张图片制作gif文件
最近基于现在环境,无法录屏,但又想制作连续的步骤流程。因此想到图片生成gif方法。 下面是从网络找到的两种方法。
- 第一种方法将图片制作成gif实测没达到需求
package main
import (
"fmt"
"image"
"image/color"
"image/color/palette"
"image/draw"
"image/gif"
"image/png"
"os"
)
func isInPalette(p color.Palette, c color.Color) int {
ret := -1
for i, v := range p {
if v == c {
return i
}
}
return ret
}
func getPalette(m image.Image) color.Palette {
p := color.Palette{color.RGBA{0x00,0x00,0x00,0x00}}
p9 := color.Palette(palette.Plan9)
b := m.Bounds()
black := false
for y := b.Min.Y; y < b.Max.Y; y++ {
for x := b.Min.X; x < b.Max.X; x++ {
c := m.At(x, y)
cc := p9.Convert(c)
if cc == p9[0] {
black = true
}
if isInPalette(p, cc) == -1 {
p = append(p, cc)
}
}
}
if len(p) < 256 && black == true {
p[0] = color.RGBA{0x00,0x00,0x00,0x00} // transparent
p = append(p, p9[0])
}
return p
}
func main() {
var disposals []byte
var images []*image.Paletted
var delays []int
for i := 1; i < 50; i++ {
var src string
if i < 10 {
src = fmt.Sprintf("zi_00%d.png", i)
} else {
src = fmt.Sprintf("zi_0%d.png", i)
}
file, err := os.Open(src)
if err != nil {
fmt.Println(err)
}
defer func() { _ = file.Close() }()
g, err := png.Decode(file)
if err != nil {
fmt.Println(err)
}
cp := getPalette(g)
//cp:=append(palette.WebSafe,color.Transparent)
disposals = append(disposals, gif.DisposalBackground)//透明图片需要设置
p := image.NewPaletted(image.Rect(0, 0, 640,996),cp)
draw.Draw(p, p.Bounds(), g, image.ZP, draw.Src)
images = append(images, p)
delays = append(delays,4)
}
g := &gif.GIF{
Image: images,
Delay: delays,
LoopCount: -1,
Disposal: disposals,
}
f, err := os.Create("test1.gif")
if err != nil {
fmt.Println(err)
}
defer func() { _ = f.Close() }()
gif.EncodeAll(f, g)
}
————————————————
版权声明:本文为CSDN博主「CrazyWorkers」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/CrazyWorkers/article/details/112324356
- 第二种方法,实测可行。 出处已经不记得,根据基础上做了小修改。
- 制作gif主要原来图片的命名,否则gif就不是按照你要的顺序。另外一个注意点就是ioutil.ReadDir()中最好独立放原图片,而且命名统一顺序。
func PicToGif2() {
var path, output string
var delay int
path = "./"
output = "test2.gif"
delay = 100
files, err := ioutil.ReadDir(path)
if err != nil {
fmt.Println(err)
return
}
anim := gif.GIF{}
for _, info := range files {
//fmt.Println("add one")
if !strings.HasSuffix(info.Name(), "jpg") {
continue
}
fmt.Println("show file:", info.Name())
f, err := os.Open(path + "/" + info.Name())
if err != nil {
fmt.Printf("Could not open file %s. Error: %s\n", info.Name(), err)
return
}
defer f.Close()
img, _, _ := image.Decode(f)
paletted := image.NewPaletted(img.Bounds(), palette.Plan9)
draw.FloydSteinberg.Draw(paletted, img.Bounds(), img, image.ZP)
anim.Image = append(anim.Image, paletted)
anim.Delay = append(anim.Delay, delay)
}
f, _ := os.Create(output)
defer f.Close()
gif.EncodeAll(f, &anim)
}
本文来自博客园,作者:ljymoonlight,转载请注明原文链接:https://www.cnblogs.com/ljymoonlight/p/15022472.html
posted on 2021-07-17 06:00 ljymoonlight 阅读(533) 评论(0) 编辑 收藏 举报