refactor: 更新 ResizeImageByMaxHeight2Image 函数,支持处理 GIF 格式并返回多个图像及延迟信息,支持返回GIF结果
This commit is contained in:
parent
1ec5e051e9
commit
89b672be8d
2
go.mod
2
go.mod
@ -5,7 +5,7 @@ go 1.23.0
|
|||||||
toolchain go1.23.3
|
toolchain go1.23.3
|
||||||
|
|
||||||
require (
|
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/bytedance/mockey v1.2.14
|
||||||
github.com/chromedp/cdproto v0.0.0-20241003230502-a4a8f7c660df
|
github.com/chromedp/cdproto v0.0.0-20241003230502-a4a8f7c660df
|
||||||
github.com/chromedp/chromedp v0.10.0
|
github.com/chromedp/chromedp v0.10.0
|
||||||
|
4
go.sum
4
go.sum
@ -1,9 +1,9 @@
|
|||||||
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
||||||
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
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 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-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 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
|
||||||
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
|
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=
|
github.com/Microsoft/go-winio v0.4.14 h1:+hMXMk01us9KgxGb7ftKQt2Xpf5hH/yky+TDA+qxleU=
|
||||||
|
@ -571,13 +571,14 @@ func (p PlayerDataLite) LastDiffToImage(lastQueryData PlayerDataLite) string {
|
|||||||
log.Default().Printf("渲染文字失败,err:%v", err)
|
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 {
|
if err != nil {
|
||||||
log.Default().Printf("缩放头像失败,url:%s,err:%v", p.Avatar, err)
|
log.Default().Printf("缩放头像失败,url:%s,err:%v", p.Avatar, err)
|
||||||
}
|
}
|
||||||
avatarSpirit := sprite.Sprite{
|
avatarSpirit := sprite.Sprite{
|
||||||
Name: "avatar",
|
Name: "avatar",
|
||||||
Images: []image.Image{avatar},
|
Images: avatar,
|
||||||
|
Delay: delay,
|
||||||
Index: 1,
|
Index: 1,
|
||||||
}
|
}
|
||||||
if avatar == nil {
|
if avatar == nil {
|
||||||
@ -606,7 +607,12 @@ func (p PlayerDataLite) LastDiffToImage(lastQueryData PlayerDataLite) string {
|
|||||||
Position: image.Point{X: minX - 5, Y: minY - 5},
|
Position: image.Point{X: minX - 5, Y: minY - 5},
|
||||||
}
|
}
|
||||||
baseboard.AddSprite(&backgroundSpirit)
|
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 {
|
if err := baseboard.SaveToPng(util.GenTempFilePath("cbl.png")); err != nil {
|
||||||
log.Default().Printf("保存图片失败,err:%v", err)
|
log.Default().Printf("保存图片失败,err:%v", err)
|
||||||
}
|
}
|
||||||
|
@ -390,13 +390,14 @@ func (p PlayerDataLite) LastDiffToImage(lastQueryData PlayerDataLite) string {
|
|||||||
log.Default().Printf("渲染文字失败,err:%v", err)
|
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 {
|
if err != nil {
|
||||||
log.Default().Printf("缩放头像失败,url:%s,err:%v", p.ProfilePicture, err)
|
log.Default().Printf("缩放头像失败,url:%s,err:%v", p.ProfilePicture, err)
|
||||||
}
|
}
|
||||||
avatarSpirit := sprite.Sprite{
|
avatarSpirit := sprite.Sprite{
|
||||||
Name: "avatar",
|
Name: "avatar",
|
||||||
Images: []image.Image{avatar},
|
Images: avatar,
|
||||||
|
Delay: delay,
|
||||||
Index: 1,
|
Index: 1,
|
||||||
}
|
}
|
||||||
if avatar == nil {
|
if avatar == nil {
|
||||||
@ -425,7 +426,12 @@ func (p PlayerDataLite) LastDiffToImage(lastQueryData PlayerDataLite) string {
|
|||||||
Position: image.Point{X: minX - 5, Y: minY - 5},
|
Position: image.Point{X: minX - 5, Y: minY - 5},
|
||||||
}
|
}
|
||||||
baseboard.AddSprite(&backgroundSpirit)
|
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 {
|
if err := baseboard.SaveToPng(util.GenTempFilePath("css.png")); err != nil {
|
||||||
log.Default().Printf("保存图片失败,err:%v", err)
|
log.Default().Printf("保存图片失败,err:%v", err)
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@ package util
|
|||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"image"
|
"image"
|
||||||
|
"image/gif"
|
||||||
"image/jpeg"
|
"image/jpeg"
|
||||||
"image/png"
|
"image/png"
|
||||||
"os"
|
"os"
|
||||||
@ -123,12 +124,16 @@ func ResizeImageByMaxHeight2File(imagePath string, maxHeight uint) (outputPath s
|
|||||||
var img image.Image
|
var img image.Image
|
||||||
var decodeErr error
|
var decodeErr error
|
||||||
|
|
||||||
|
var gifImg *gif.GIF
|
||||||
|
|
||||||
ext := strings.ToLower(filepath.Ext(imagePath))
|
ext := strings.ToLower(filepath.Ext(imagePath))
|
||||||
switch ext {
|
switch ext {
|
||||||
case ".jpg", ".jpeg":
|
case ".jpg", ".jpeg":
|
||||||
img, decodeErr = jpeg.Decode(file)
|
img, decodeErr = jpeg.Decode(file)
|
||||||
case ".png":
|
case ".png":
|
||||||
img, decodeErr = png.Decode(file)
|
img, decodeErr = png.Decode(file)
|
||||||
|
case ".gif":
|
||||||
|
gifImg, decodeErr = gif.DecodeAll(file)
|
||||||
default:
|
default:
|
||||||
return "", errors.New("unsupported image format")
|
return "", errors.New("unsupported image format")
|
||||||
}
|
}
|
||||||
@ -139,7 +144,15 @@ func ResizeImageByMaxHeight2File(imagePath string, maxHeight uint) (outputPath s
|
|||||||
|
|
||||||
// 计算缩放后的尺寸,保持宽高比
|
// 计算缩放后的尺寸,保持宽高比
|
||||||
// 传入0作为宽度,resize包会自动计算等比例的宽度
|
// 传入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
|
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)
|
return outputPath, jpeg.Encode(out, resized, nil)
|
||||||
case ".png":
|
case ".png":
|
||||||
return outputPath, png.Encode(out, resized)
|
return outputPath, png.Encode(out, resized)
|
||||||
|
case ".gif":
|
||||||
|
return outputPath, gif.EncodeAll(out, gifImg)
|
||||||
default:
|
default:
|
||||||
return "", errors.New("unsupported image format")
|
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)
|
file, err := os.Open(imagePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
|
||||||
@ -172,25 +187,37 @@ func ResizeImageByMaxHeight2Image(imagePath string, maxHeight uint) (output imag
|
|||||||
var img image.Image
|
var img image.Image
|
||||||
var decodeErr error
|
var decodeErr error
|
||||||
|
|
||||||
|
var gifImg *gif.GIF
|
||||||
|
|
||||||
ext := strings.ToLower(filepath.Ext(imagePath))
|
ext := strings.ToLower(filepath.Ext(imagePath))
|
||||||
switch ext {
|
switch ext {
|
||||||
case ".jpg", ".jpeg":
|
case ".jpg", ".jpeg":
|
||||||
img, decodeErr = jpeg.Decode(file)
|
img, decodeErr = jpeg.Decode(file)
|
||||||
case ".png":
|
case ".png":
|
||||||
img, decodeErr = png.Decode(file)
|
img, decodeErr = png.Decode(file)
|
||||||
|
case ".gif":
|
||||||
|
gifImg, decodeErr = gif.DecodeAll(file)
|
||||||
default:
|
default:
|
||||||
return nil, errors.New("unsupported image format")
|
return nil, nil, errors.New("unsupported image format")
|
||||||
}
|
}
|
||||||
|
|
||||||
if decodeErr != nil {
|
if decodeErr != nil {
|
||||||
return nil, decodeErr
|
return nil, nil, decodeErr
|
||||||
}
|
}
|
||||||
|
|
||||||
// 计算缩放后的尺寸,保持宽高比
|
// 计算缩放后的尺寸,保持宽高比
|
||||||
// 传入0作为宽度,resize包会自动计算等比例的宽度
|
// 传入0作为宽度,resize包会自动计算等比例的宽度
|
||||||
resized := resize.Resize(0, maxHeight, img, resize.Lanczos3)
|
var resized []image.Image
|
||||||
|
if gifImg == nil {
|
||||||
return resized, 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 {
|
func GetResizedIamgePathByOrgPath(orgPath string) string {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user