From abcab9dfc733d87bb1103b3e70c34464c76fe60b Mon Sep 17 00:00:00 2001 From: lixiangwuxian Date: Wed, 14 May 2025 00:01:40 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0WebP=E6=94=AF?= =?UTF-8?q?=E6=8C=81=EF=BC=8C=E6=9B=B4=E6=96=B0SaveToGif=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E5=B9=B6=E6=96=B0=E5=A2=9ESaveToWebp=E6=96=B9=E6=B3=95?= =?UTF-8?q?=EF=BC=8C=E6=9B=B4=E6=96=B0=E4=BE=9D=E8=B5=96=E9=A1=B9=E4=BB=A5?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=96=B0=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- go.mod | 2 ++ go.sum | 4 ++++ main.go | 5 ++++- sprite/named_sprite_board.go | 40 +++++++++++++++++++++++++++++++++++- 5 files changed, 50 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 29f5104..64d4824 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,4 @@ test.png .vscode/launch.json imagedd -test.gif +test.* diff --git a/go.mod b/go.mod index 6bc49a6..e6aa934 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,8 @@ require ( ) require ( + github.com/HugoSmits86/nativewebp v1.2.0 // indirect + github.com/kettek/apng v0.0.0-20220823221153-ff692776a607 // indirect golang.org/x/net v0.0.0-20211118161319-6a13c67c3ce4 // indirect golang.org/x/text v0.25.0 // indirect ) diff --git a/go.sum b/go.sum index 57d4894..a4c4016 100644 --- a/go.sum +++ b/go.sum @@ -1,5 +1,9 @@ +github.com/HugoSmits86/nativewebp v1.2.0 h1:XJtXeTg7FsOi9VB1elQYZy3n6VjYLqofSr3gGRLUOp4= +github.com/HugoSmits86/nativewebp v1.2.0/go.mod h1:YNQuWenlVmSUUASVNhTDwf4d7FwYQGbGhklC8p72Vr8= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/kettek/apng v0.0.0-20220823221153-ff692776a607 h1:8tP9cdXzcGX2AvweVVG/lxbI7BSjWbNNUustwJ9dQVA= +github.com/kettek/apng v0.0.0-20220823221153-ff692776a607/go.mod h1:x78/VRQYKuCftMWS0uK5e+F5RJ7S4gSlESRWI0Prl6Q= github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c h1:km8GpoQut05eY3GiYWEedbTT0qnSxrCjsVbb7yKY1KE= github.com/srwiley/oksvg v0.0.0-20221011165216-be6e8873101c/go.mod h1:cNQ3dwVJtS5Hmnjxy6AgTPd0Inb3pW05ftPSX7NZO7Q= github.com/srwiley/rasterx v0.0.0-20220730225603-2ab79fcdd4ef h1:Ch6Q+AZUxDBCVqdkI8FSpFyZDtCVBc2VmejdNrm5rRQ= diff --git a/main.go b/main.go index 1c8f886..e0ec0e2 100644 --- a/main.go +++ b/main.go @@ -146,7 +146,10 @@ func main() { board.AddSprite(gifSprite) } board.SaveToPng("test.png") - if err := board.SaveToGIF("test.gif"); err != nil { + if err := board.SaveToGif("test.gif"); err != nil { + log.Fatal(err) + } + if err := board.SaveToWebp("test.webp"); err != nil { log.Fatal(err) } } diff --git a/sprite/named_sprite_board.go b/sprite/named_sprite_board.go index ba7e2c3..a4c4c3a 100644 --- a/sprite/named_sprite_board.go +++ b/sprite/named_sprite_board.go @@ -1,6 +1,7 @@ package sprite import ( + "errors" "image" "image/color/palette" "image/draw" @@ -9,6 +10,8 @@ import ( "log" "os" "sort" + + "github.com/HugoSmits86/nativewebp" ) // 设置为true启用调试日志 @@ -864,7 +867,7 @@ func (b *NamedSpriteBoard) SaveToPng(filename string) error { return nil } -func (b *NamedSpriteBoard) SaveToGIF(filename string) error { +func (b *NamedSpriteBoard) SaveToGif(filename string) error { // 获取动画帧 frames, delays := b.RenderToAnimatedImage() if len(frames) == 0 { @@ -921,3 +924,38 @@ func (b *NamedSpriteBoard) SaveToGIF(filename string) error { return nil } + +func (b *NamedSpriteBoard) SaveToWebp(filename string) error { + frames, delays := b.RenderToAnimatedImage() + if len(frames) == 0 { + return errors.New("no frames to save") + } + images := make([]image.Image, len(frames)) + for i, frame := range frames { + images[i] = frame + } + durations := make([]uint, len(delays)) + for i, delay := range delays { + durations[i] = uint(delay) + } + disposals := make([]uint, len(delays)) + for i := range disposals { + disposals[i] = 0 + } + ani := nativewebp.Animation{ + Images: images, + Durations: durations, + Disposals: disposals, + LoopCount: 0, + BackgroundColor: 0xffffffff, + } + f, err := os.Create(filename) + if err != nil { + return err + } + defer f.Close() + if err := nativewebp.EncodeAll(f, &ani, &nativewebp.Options{}); err != nil { + return err + } + return nil +}