feat: 添加GIF支持,更新SaveToGIF方法以使用WebSafe调色板,新增nailong.gif文件,更新main.go以处理GIF精灵。

This commit is contained in:
lixiangwuxian 2025-05-13 23:30:39 +08:00
parent 46f967360b
commit c482f721b1
3 changed files with 48 additions and 22 deletions

2
.gitignore vendored
View File

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

61
main.go
View File

@ -1,9 +1,13 @@
package main package main
import ( import (
"bytes"
"image" "image"
"image/color" "image/color"
"image/png"
"log" "log"
"math"
"os"
"git.lxtend.com/lixiangwuxian/imagedd/sprite" "git.lxtend.com/lixiangwuxian/imagedd/sprite"
"git.lxtend.com/lixiangwuxian/imagedd/text2img" "git.lxtend.com/lixiangwuxian/imagedd/text2img"
@ -56,25 +60,25 @@ func main() {
textSprite.AddFrame(img) textSprite.AddFrame(img)
board.AddSprite(textSprite) board.AddSprite(textSprite)
} }
// { {
// faceBytes, err := os.ReadFile("face.png") faceBytes, err := os.ReadFile("face.png")
// if err != nil { if err != nil {
// log.Fatal(err) log.Fatal(err)
// } }
// faceImage, err := png.Decode(bytes.NewReader(faceBytes)) faceImage, err := png.Decode(bytes.NewReader(faceBytes))
// if err != nil { if err != nil {
// log.Fatal(err) log.Fatal(err)
// } }
// faceSprite := &sprite.Sprite{ faceSprite := &sprite.Sprite{
// Name: "face", Name: "face",
// Images: []image.Image{faceImage}, Images: []image.Image{faceImage},
// CurrentFrame: 0, CurrentFrame: 0,
// Index: 1, Index: 1,
// Position: image.Point{X: -100, Y: -100}, Position: image.Point{X: -100, Y: -100},
// } }
// faceSprite.Rotate(math.Pi / 2) faceSprite.Rotate(math.Pi / 2)
// board.AddSprite(faceSprite) board.AddSprite(faceSprite)
// } }
{ {
rect := image.NewRGBA(image.Rect(0, 0, 101, 101)) rect := image.NewRGBA(image.Rect(0, 0, 101, 101))
rectSprite := &sprite.Sprite{ rectSprite := &sprite.Sprite{
@ -125,5 +129,24 @@ func main() {
} }
board.AddSprite(circleSprite) 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") board.SaveToPng("test.png")
if err := board.SaveToGIF("test.gif"); err != nil {
log.Fatal(err)
}
} }

View File

@ -2,6 +2,7 @@ package sprite
import ( import (
"image" "image"
"image/color/palette"
"image/draw" "image/draw"
"image/gif" "image/gif"
"image/png" "image/png"
@ -877,9 +878,9 @@ func (b *NamedSpriteBoard) SaveToGIF(filename string) error {
} }
defer f.Close() defer f.Close()
// 将RGBA图像转换为Paletted图像 // 将RGBA图像转换为Paletted图像使用WebSafe调色板
bounds := img.Bounds() bounds := img.Bounds()
palettedImg := image.NewPaletted(bounds, nil) palettedImg := image.NewPaletted(bounds, palette.WebSafe)
draw.Draw(palettedImg, bounds, img, bounds.Min, draw.Src) draw.Draw(palettedImg, bounds, img, bounds.Min, draw.Src)
// 将图像编码为GIF并写入文件 // 将图像编码为GIF并写入文件
@ -899,7 +900,7 @@ func (b *NamedSpriteBoard) SaveToGIF(filename string) error {
// 转换所有帧为Paletted图像 // 转换所有帧为Paletted图像
for i, frame := range frames { for i, frame := range frames {
bounds := frame.Bounds() 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) draw.Draw(palettedFrames[i], bounds, frame, bounds.Min, draw.Src)
} }