From c482f721b1ae7e442cf74c222b1a9c979cd68869 Mon Sep 17 00:00:00 2001 From: lixiangwuxian Date: Tue, 13 May 2025 23:30:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0GIF=E6=94=AF=E6=8C=81?= =?UTF-8?q?=EF=BC=8C=E6=9B=B4=E6=96=B0SaveToGIF=E6=96=B9=E6=B3=95=E4=BB=A5?= =?UTF-8?q?=E4=BD=BF=E7=94=A8WebSafe=E8=B0=83=E8=89=B2=E6=9D=BF=EF=BC=8C?= =?UTF-8?q?=E6=96=B0=E5=A2=9Enailong.gif=E6=96=87=E4=BB=B6=EF=BC=8C?= =?UTF-8?q?=E6=9B=B4=E6=96=B0main.go=E4=BB=A5=E5=A4=84=E7=90=86GIF?= =?UTF-8?q?=E7=B2=BE=E7=81=B5=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 ++ main.go | 61 +++++++++++++++++++++++++----------- sprite/named_sprite_board.go | 7 +++-- 3 files changed, 48 insertions(+), 22 deletions(-) diff --git a/.gitignore b/.gitignore index 9abfbd9..29f5104 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ test.png .vscode/launch.json +imagedd +test.gif diff --git a/main.go b/main.go index bf3afe2..1c8f886 100644 --- a/main.go +++ b/main.go @@ -1,9 +1,13 @@ package main import ( + "bytes" "image" "image/color" + "image/png" "log" + "math" + "os" "git.lxtend.com/lixiangwuxian/imagedd/sprite" "git.lxtend.com/lixiangwuxian/imagedd/text2img" @@ -56,25 +60,25 @@ func main() { textSprite.AddFrame(img) board.AddSprite(textSprite) } - // { - // faceBytes, err := os.ReadFile("face.png") - // if err != nil { - // log.Fatal(err) - // } - // faceImage, err := png.Decode(bytes.NewReader(faceBytes)) - // if err != nil { - // log.Fatal(err) - // } - // faceSprite := &sprite.Sprite{ - // Name: "face", - // Images: []image.Image{faceImage}, - // CurrentFrame: 0, - // Index: 1, - // Position: image.Point{X: -100, Y: -100}, - // } - // faceSprite.Rotate(math.Pi / 2) - // board.AddSprite(faceSprite) - // } + { + faceBytes, err := os.ReadFile("face.png") + if err != nil { + log.Fatal(err) + } + faceImage, err := png.Decode(bytes.NewReader(faceBytes)) + if err != nil { + log.Fatal(err) + } + faceSprite := &sprite.Sprite{ + Name: "face", + Images: []image.Image{faceImage}, + CurrentFrame: 0, + Index: 1, + Position: image.Point{X: -100, Y: -100}, + } + faceSprite.Rotate(math.Pi / 2) + board.AddSprite(faceSprite) + } { rect := image.NewRGBA(image.Rect(0, 0, 101, 101)) rectSprite := &sprite.Sprite{ @@ -125,5 +129,24 @@ func main() { } board.AddSprite(circleSprite) } + { + gifSprite := &sprite.Sprite{ + Name: "gif", + Images: []image.Image{}, + CurrentFrame: 0, + Index: 4, + Position: image.Point{X: 40, Y: 20}, + } + gifImage, delays, err := sprite.LoadImageFile("nailong.gif") + if err != nil { + log.Fatal(err) + } + gifSprite.SetFrames(gifImage) + gifSprite.Delay = delays + board.AddSprite(gifSprite) + } board.SaveToPng("test.png") + if err := board.SaveToGIF("test.gif"); err != nil { + log.Fatal(err) + } } diff --git a/sprite/named_sprite_board.go b/sprite/named_sprite_board.go index b15c3f7..ba7e2c3 100644 --- a/sprite/named_sprite_board.go +++ b/sprite/named_sprite_board.go @@ -2,6 +2,7 @@ package sprite import ( "image" + "image/color/palette" "image/draw" "image/gif" "image/png" @@ -877,9 +878,9 @@ func (b *NamedSpriteBoard) SaveToGIF(filename string) error { } defer f.Close() - // 将RGBA图像转换为Paletted图像 + // 将RGBA图像转换为Paletted图像,使用WebSafe调色板 bounds := img.Bounds() - palettedImg := image.NewPaletted(bounds, nil) + palettedImg := image.NewPaletted(bounds, palette.WebSafe) draw.Draw(palettedImg, bounds, img, bounds.Min, draw.Src) // 将图像编码为GIF并写入文件 @@ -899,7 +900,7 @@ func (b *NamedSpriteBoard) SaveToGIF(filename string) error { // 转换所有帧为Paletted图像 for i, frame := range frames { bounds := frame.Bounds() - palettedFrames[i] = image.NewPaletted(bounds, nil) + palettedFrames[i] = image.NewPaletted(bounds, palette.WebSafe) draw.Draw(palettedFrames[i], bounds, frame, bounds.Min, draw.Src) }