From 82e354862815b59e36a75d360242b9ac64d4f65d Mon Sep 17 00:00:00 2001 From: lixiangwuxian Date: Wed, 14 May 2025 00:08:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9EAPNG=E6=94=AF?= =?UTF-8?q?=E6=8C=81=EF=BC=8C=E6=B7=BB=E5=8A=A0SaveToApng=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E5=B9=B6=E6=9B=B4=E6=96=B0main.go=E4=BB=A5=E5=A4=84?= =?UTF-8?q?=E7=90=86APNG=E7=B2=BE=E7=81=B5=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 3 +++ sprite/named_sprite_board.go | 27 +++++++++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/main.go b/main.go index e0ec0e2..bd0e827 100644 --- a/main.go +++ b/main.go @@ -149,6 +149,9 @@ func main() { if err := board.SaveToGif("test.gif"); err != nil { log.Fatal(err) } + if err := board.SaveToApng("test.apng"); 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 a4c4c3a..eb18963 100644 --- a/sprite/named_sprite_board.go +++ b/sprite/named_sprite_board.go @@ -12,6 +12,7 @@ import ( "sort" "github.com/HugoSmits86/nativewebp" + "github.com/kettek/apng" ) // 设置为true启用调试日志 @@ -959,3 +960,29 @@ func (b *NamedSpriteBoard) SaveToWebp(filename string) error { } return nil } + +func (b *NamedSpriteBoard) SaveToApng(filename string) error { + frames, delays := b.RenderToAnimatedImage() + if len(frames) == 0 { + return errors.New("no frames to save") + } + apngData := apng.APNG{ + Frames: make([]apng.Frame, len(frames)), + } + for i, frame := range frames { + apngData.Frames[i] = apng.Frame{ + Image: frame, + DelayNumerator: uint16(delays[i]), + DelayDenominator: 100, + } + } + f, err := os.Create(filename) + if err != nil { + return err + } + defer f.Close() + if err := apng.Encode(f, apngData); err != nil { + return err + } + return nil +}