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