70 lines
1.6 KiB
Go
70 lines
1.6 KiB
Go
package service
|
|
|
|
import (
|
|
"bytes"
|
|
"image"
|
|
"image/color"
|
|
"image/jpeg"
|
|
"image/png"
|
|
"testing"
|
|
)
|
|
|
|
// makeTestImage 生成指定尺寸的 jpg/png 测试图
|
|
func makeTestImage(t *testing.T, w, h int, pngFmt bool) []byte {
|
|
t.Helper()
|
|
img := image.NewRGBA(image.Rect(0, 0, w, h))
|
|
for y := 0; y < h; y++ {
|
|
for x := 0; x < w; x++ {
|
|
img.Set(x, y, color.RGBA{R: uint8(x % 256), G: uint8(y % 256), B: 128, A: 255})
|
|
}
|
|
}
|
|
var buf bytes.Buffer
|
|
if pngFmt {
|
|
if err := png.Encode(&buf, img); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
} else {
|
|
if err := jpeg.Encode(&buf, img, &jpeg.Options{Quality: 92}); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
}
|
|
return buf.Bytes()
|
|
}
|
|
|
|
// decodeSize 解码并返回宽高
|
|
func decodeSize(t *testing.T, data []byte) (int, int) {
|
|
t.Helper()
|
|
img, _, err := image.Decode(bytes.NewReader(data))
|
|
if err != nil {
|
|
t.Fatalf("解码失败: %v", err)
|
|
}
|
|
return img.Bounds().Dx(), img.Bounds().Dy()
|
|
}
|
|
|
|
func TestResizeCover(t *testing.T) {
|
|
cases := []struct {
|
|
name string
|
|
w, h int
|
|
png bool
|
|
}{
|
|
{"标准16:9大图", 3000, 1688, false},
|
|
{"超宽图", 4000, 1000, false},
|
|
{"超窄图", 800, 3000, false},
|
|
{"接近目标尺寸", 1280, 720, false},
|
|
{"小于目标尺寸", 800, 600, false},
|
|
{"PNG透明通道", 2000, 1500, true},
|
|
}
|
|
for _, c := range cases {
|
|
t.Run(c.name, func(t *testing.T) {
|
|
out, err := resizeCover(makeTestImage(t, c.w, c.h, c.png))
|
|
if err != nil {
|
|
t.Fatalf("resizeCover 失败: %v", err)
|
|
}
|
|
gotW, gotH := decodeSize(t, out)
|
|
if gotW != coverWidth || gotH != coverHeight {
|
|
t.Fatalf("尺寸错误: got %dx%d, want %dx%d", gotW, gotH, coverWidth, coverHeight)
|
|
}
|
|
})
|
|
}
|
|
}
|