refactor: 更新 ResizeImageByMaxHeight2Image 函数,支持处理 GIF 格式并返回多个图像及延迟信息,支持返回GIF结果

This commit is contained in:
lixiangwuxian 2025-05-13 23:41:19 +08:00
parent 1ec5e051e9
commit 89b672be8d
5 changed files with 56 additions and 17 deletions

2
go.mod
View File

@ -5,7 +5,7 @@ go 1.23.0
toolchain go1.23.3
require (
git.lxtend.com/lixiangwuxian/imagedd v0.0.0-20250513115110-2cf9da089612
git.lxtend.com/lixiangwuxian/imagedd v0.0.0-20250513153039-c482f721b1ae
github.com/bytedance/mockey v1.2.14
github.com/chromedp/cdproto v0.0.0-20241003230502-a4a8f7c660df
github.com/chromedp/chromedp v0.10.0

4
go.sum
View File

@ -1,9 +1,9 @@
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
git.lxtend.com/lixiangwuxian/imagedd v0.0.0-20250510064143-ba9126d54ac6 h1:v1cEHG5kGJN5Tu+3icJ6gfrcwrXJRZQMCu8eb4goEKQ=
git.lxtend.com/lixiangwuxian/imagedd v0.0.0-20250510064143-ba9126d54ac6/go.mod h1:luas4p32Wtsywcz+8HsxIB3gf65FDDBa+3XYhm0S2b8=
git.lxtend.com/lixiangwuxian/imagedd v0.0.0-20250513115110-2cf9da089612 h1:ew7YcheoePX1rQ9XQxqvfWLkAdGyCVD3h8LRjO5i/dQ=
git.lxtend.com/lixiangwuxian/imagedd v0.0.0-20250513115110-2cf9da089612/go.mod h1:luas4p32Wtsywcz+8HsxIB3gf65FDDBa+3XYhm0S2b8=
git.lxtend.com/lixiangwuxian/imagedd v0.0.0-20250513153039-c482f721b1ae h1:uFuLriBS+ciaUanGbe3FV8acxlwVvV1CA+zkn7292i0=
git.lxtend.com/lixiangwuxian/imagedd v0.0.0-20250513153039-c482f721b1ae/go.mod h1:luas4p32Wtsywcz+8HsxIB3gf65FDDBa+3XYhm0S2b8=
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU=

View File

@ -571,13 +571,14 @@ func (p PlayerDataLite) LastDiffToImage(lastQueryData PlayerDataLite) string {
log.Default().Printf("渲染文字失败err:%v", err)
}
avatar, err := util.ResizeImageByMaxHeight2Image(filePath, uint(textImg.Bounds().Dy()))
avatar, delay, err := util.ResizeImageByMaxHeight2Image(filePath, uint(textImg.Bounds().Dy()))
if err != nil {
log.Default().Printf("缩放头像失败url:%s,err:%v", p.Avatar, err)
}
avatarSpirit := sprite.Sprite{
Name: "avatar",
Images: []image.Image{avatar},
Images: avatar,
Delay: delay,
Index: 1,
}
if avatar == nil {
@ -606,7 +607,12 @@ func (p PlayerDataLite) LastDiffToImage(lastQueryData PlayerDataLite) string {
Position: image.Point{X: minX - 5, Y: minY - 5},
}
baseboard.AddSprite(&backgroundSpirit)
if len(avatarSpirit.Images) > 1 {
if err := baseboard.SaveToGIF(util.GenTempFilePath("cbl.gif")); err != nil {
log.Default().Printf("保存图片失败err:%v", err)
}
return util.GenTempFilePath("cbl.gif")
}
if err := baseboard.SaveToPng(util.GenTempFilePath("cbl.png")); err != nil {
log.Default().Printf("保存图片失败err:%v", err)
}

View File

@ -390,13 +390,14 @@ func (p PlayerDataLite) LastDiffToImage(lastQueryData PlayerDataLite) string {
log.Default().Printf("渲染文字失败err:%v", err)
}
avatar, err := util.ResizeImageByMaxHeight2Image(filePath, uint(textImg.Bounds().Dy()))
avatar, delay, err := util.ResizeImageByMaxHeight2Image(filePath, uint(textImg.Bounds().Dy()))
if err != nil {
log.Default().Printf("缩放头像失败url:%s,err:%v", p.ProfilePicture, err)
}
avatarSpirit := sprite.Sprite{
Name: "avatar",
Images: []image.Image{avatar},
Images: avatar,
Delay: delay,
Index: 1,
}
if avatar == nil {
@ -425,7 +426,12 @@ func (p PlayerDataLite) LastDiffToImage(lastQueryData PlayerDataLite) string {
Position: image.Point{X: minX - 5, Y: minY - 5},
}
baseboard.AddSprite(&backgroundSpirit)
if len(avatarSpirit.Images) > 1 {
if err := baseboard.SaveToGIF(util.GenTempFilePath("css.gif")); err != nil {
log.Default().Printf("保存图片失败err:%v", err)
}
return util.GenTempFilePath("css.gif")
}
if err := baseboard.SaveToPng(util.GenTempFilePath("css.png")); err != nil {
log.Default().Printf("保存图片失败err:%v", err)
}

View File

@ -3,6 +3,7 @@ package util
import (
"errors"
"image"
"image/gif"
"image/jpeg"
"image/png"
"os"
@ -123,12 +124,16 @@ func ResizeImageByMaxHeight2File(imagePath string, maxHeight uint) (outputPath s
var img image.Image
var decodeErr error
var gifImg *gif.GIF
ext := strings.ToLower(filepath.Ext(imagePath))
switch ext {
case ".jpg", ".jpeg":
img, decodeErr = jpeg.Decode(file)
case ".png":
img, decodeErr = png.Decode(file)
case ".gif":
gifImg, decodeErr = gif.DecodeAll(file)
default:
return "", errors.New("unsupported image format")
}
@ -139,7 +144,15 @@ func ResizeImageByMaxHeight2File(imagePath string, maxHeight uint) (outputPath s
// 计算缩放后的尺寸,保持宽高比
// 传入0作为宽度resize包会自动计算等比例的宽度
resized := resize.Resize(0, maxHeight, img, resize.Lanczos3)
var resized image.Image
if gifImg == nil {
resized = resize.Resize(0, maxHeight, img, resize.Lanczos3)
} else {
for i, frame := range gifImg.Image {
resized = resize.Resize(0, maxHeight, frame, resize.Lanczos3)
gifImg.Image[i] = resized.(*image.Paletted)
}
}
// 创建输出文件
outputPath = strings.TrimSuffix(imagePath, ext) + "_resized" + ext
@ -155,16 +168,18 @@ func ResizeImageByMaxHeight2File(imagePath string, maxHeight uint) (outputPath s
return outputPath, jpeg.Encode(out, resized, nil)
case ".png":
return outputPath, png.Encode(out, resized)
case ".gif":
return outputPath, gif.EncodeAll(out, gifImg)
default:
return "", errors.New("unsupported image format")
}
}
func ResizeImageByMaxHeight2Image(imagePath string, maxHeight uint) (output image.Image, err error) {
func ResizeImageByMaxHeight2Image(imagePath string, maxHeight uint) (output []image.Image, delay []int, err error) {
// 打开源图片文件
file, err := os.Open(imagePath)
if err != nil {
return nil, err
return nil, nil, err
}
defer file.Close()
@ -172,25 +187,37 @@ func ResizeImageByMaxHeight2Image(imagePath string, maxHeight uint) (output imag
var img image.Image
var decodeErr error
var gifImg *gif.GIF
ext := strings.ToLower(filepath.Ext(imagePath))
switch ext {
case ".jpg", ".jpeg":
img, decodeErr = jpeg.Decode(file)
case ".png":
img, decodeErr = png.Decode(file)
case ".gif":
gifImg, decodeErr = gif.DecodeAll(file)
default:
return nil, errors.New("unsupported image format")
return nil, nil, errors.New("unsupported image format")
}
if decodeErr != nil {
return nil, decodeErr
return nil, nil, decodeErr
}
// 计算缩放后的尺寸,保持宽高比
// 传入0作为宽度resize包会自动计算等比例的宽度
resized := resize.Resize(0, maxHeight, img, resize.Lanczos3)
return resized, nil
var resized []image.Image
if gifImg == nil {
resized = []image.Image{resize.Resize(0, maxHeight, img, resize.Lanczos3)}
} else {
for _, frame := range gifImg.Image {
img := resize.Resize(0, maxHeight, frame, resize.Lanczos3)
resized = append(resized, img)
}
delay = gifImg.Delay
}
return resized, delay, nil
}
func GetResizedIamgePathByOrgPath(orgPath string) string {