feat: 添加WebP支持,更新SaveToGif方法并新增SaveToWebp方法,更新依赖项以支持新功能。

This commit is contained in:
lixiangwuxian 2025-05-14 00:01:40 +08:00
parent c482f721b1
commit abcab9dfc7
5 changed files with 50 additions and 3 deletions

2
.gitignore vendored
View File

@ -1,4 +1,4 @@
test.png
.vscode/launch.json
imagedd
test.gif
test.*

2
go.mod
View File

@ -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
)

4
go.sum
View File

@ -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=

View File

@ -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)
}
}

View File

@ -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
}