package sprite import ( "bytes" "image" "image/gif" _ "image/jpeg" // 注册JPEG解码器 _ "image/png" // 注册PNG解码器 "io" "os" ) // LoadImageFile 从文件加载图像,支持PNG、JPEG、GIF和静态WebP格式 func LoadImageFile(filePath string) ([]image.Image, []int, error) { // 读取文件内容 fileData, err := os.ReadFile(filePath) if err != nil { return nil, nil, err } return LoadImageData(fileData) } // LoadImageData 从字节数据加载图像,支持PNG、JPEG、GIF和静态WebP格式 func LoadImageData(fileData []byte) ([]image.Image, []int, error) { // 创建Reader reader := bytes.NewReader(fileData) // 尝试解码为GIF if isGIF(fileData) { return decodeGIF(reader) } // 尝试使用通用图像解码器(处理PNG、JPEG等) img, _, err := image.Decode(bytes.NewReader(fileData)) if err != nil { return nil, nil, err } // 返回单帧图像 return []image.Image{img}, []int{0}, nil } // isGIF 检查数据是否为GIF格式 func isGIF(data []byte) bool { return len(data) > 3 && data[0] == 'G' && data[1] == 'I' && data[2] == 'F' } // decodeGIF 解码GIF文件为图像帧序列 func decodeGIF(reader io.Reader) ([]image.Image, []int, error) { // 解码GIF gifImg, err := gif.DecodeAll(reader) if err != nil { return nil, nil, err } // 检查帧数量 frameCount := len(gifImg.Image) if frameCount == 0 { return nil, nil, nil } // 提取所有帧 images := make([]image.Image, frameCount) for i, frame := range gifImg.Image { images[i] = frame } return images, gifImg.Delay, nil } // LoadSpriteFromFile 从文件创建一个精灵 func LoadSpriteFromFile(name string, filePath string) (*Sprite, error) { // 加载图像 images, delays, err := LoadImageFile(filePath) if err != nil { return nil, err } // 创建精灵 sprite := &Sprite{ Name: name, Images: images, Delay: delays, CurrentFrame: 0, Position: image.Point{X: 0, Y: 0}, Index: 0, } return sprite, nil }