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) } }) } }