feat: 添加图片缩放功能,优化图片加载逻辑

This commit is contained in:
lixiangwuxian 2025-08-08 18:27:02 +08:00
parent 94beb84d6d
commit 13bc6aee98
2 changed files with 38 additions and 26 deletions

View File

@ -195,9 +195,10 @@ func GenerateCongratulationImageNew(textOrImg qq_message.QQMessage, inputFile, o
log.Print("无法下载图片:", err) log.Print("无法下载图片:", err)
return return
} }
im, _, err := sprite.LoadImageFile(filePath) //缩放图片
im, _, err := util.ResizeImageByMaxHeightAndWidth2Image(filePath, uint(backgroundImageSprite.GetCurrentImage().Bounds().Dy())/2, uint(backgroundImageSprite.GetCurrentImage().Bounds().Dx())/4*3)
if err != nil { if err != nil {
log.Print("无法加载图片:", err) log.Print("无法缩放图片:", err)
return return
} }
imgSprite := sprite.Sprite{ imgSprite := sprite.Sprite{

View File

@ -10,6 +10,7 @@ import (
"path/filepath" "path/filepath"
"strings" "strings"
"git.lxtend.com/lixiangwuxian/imagedd/sprite"
"github.com/nfnt/resize" "github.com/nfnt/resize"
) )
@ -182,40 +183,50 @@ func ResizeImageByMaxHeight2Image(imagePath string, maxHeight uint) (output []im
return nil, nil, err return nil, nil, err
} }
defer file.Close() defer file.Close()
img, delay, err := sprite.LoadImageFile(imagePath)
// 解码图片 if err != nil {
var img image.Image return nil, nil, err
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, nil, errors.New("unsupported image format")
}
if decodeErr != nil {
return nil, nil, decodeErr
} }
// 计算缩放后的尺寸,保持宽高比 // 计算缩放后的尺寸,保持宽高比
// 传入0作为宽度resize包会自动计算等比例的宽度 // 传入0作为宽度resize包会自动计算等比例的宽度
var resized []image.Image var resized []image.Image
if gifImg == nil { if len(img) == 1 {
resized = []image.Image{resize.Resize(0, maxHeight, img, resize.Lanczos3)} resized = []image.Image{resize.Resize(0, maxHeight, img[0], resize.Lanczos3)}
} else { } else {
for _, frame := range gifImg.Image { for _, frame := range img {
img := resize.Resize(0, maxHeight, frame, resize.Lanczos3) img := resize.Resize(0, maxHeight, frame, resize.Lanczos3)
resized = append(resized, img) resized = append(resized, img)
} }
delay = gifImg.Delay }
return resized, delay, nil
}
func ResizeImageByMaxHeightAndWidth2Image(imagePath string, maxHeight uint, maxWidth uint) (output []image.Image, delay []int, err error) {
// 打开源图片文件
file, err := os.Open(imagePath)
if err != nil {
return nil, nil, err
}
defer file.Close()
img, delay, err := sprite.LoadImageFile(imagePath)
if err != nil {
return nil, nil, err
}
// 计算缩放后的尺寸,保持宽高比
// 传入0作为宽度resize包会自动计算等比例的宽度
var resized []image.Image
if len(img) == 1 {
resized = []image.Image{resize.Resize(0, maxHeight, img[0], resize.Lanczos3)}
} else {
for _, frame := range img {
img := resize.Resize(0, maxHeight, frame, resize.Lanczos3)
img = resize.Resize(maxWidth, 0, img, resize.Lanczos3)
resized = append(resized, img)
}
} }
return resized, delay, nil return resized, delay, nil
} }