diff --git a/internal/controller/post_controller.go b/internal/controller/post_controller.go index 49c39e8..a0cba2a 100644 --- a/internal/controller/post_controller.go +++ b/internal/controller/post_controller.go @@ -449,27 +449,18 @@ func (ctrl *PostController) UploadImage(c *gin.Context) { } } - // 回退存储:重新编码以剥离 EXIF/元数据(GIF 例外:重编码会丢失动画) + // 回退存储:JPEG/PNG 重编码剥离元数据;WebP 已验证直接存;GIF 不重编(丢动画) if savePath == "" { dataOut := data - if isJPEGPNG || isWebP { - var decImg image.Image - var decErr error - if isWebP { - decImg, decErr = webp.Decode(bytes.NewReader(data)) - } else { - decImg, _, decErr = image.Decode(bytes.NewReader(data)) - } + if isJPEGPNG { + decImg, _, decErr := image.Decode(bytes.NewReader(data)) if decErr == nil { var buf bytes.Buffer var encErr error - switch { - case isWebP: - encErr = webp.Encode(&buf, decImg, &webp.Options{Quality: 80}) - case ext == ".png": + if ext == ".png" { encErr = png.Encode(&buf, decImg) - default: + } else { encErr = jpeg.Encode(&buf, decImg, &jpeg.Options{Quality: 92}) } if encErr == nil && buf.Len() > 0 { @@ -498,8 +489,8 @@ func (ctrl *PostController) applyShortcode(post *model.Post) { } } -// encodeWebPBinary 二分查找 WebP 质量,找 ≤ targetBytes 的最高质量(quality 50~80) -// 返回 nil 表示最低质量仍超限,应由调用方回退原格式 +// encodeWebPBinary 二分查找 WebP 质量,找 ≤ targetBytes 的最高质量(quality 1~80) +// 返回 nil 表示最低质量仍超限(几乎不可能发生),应由调用方回退原格式 func encodeWebPBinary(img image.Image, targetBytes int) []byte { var buf bytes.Buffer if err := webp.Encode(&buf, img, &webp.Options{Quality: 80}); err != nil { @@ -509,7 +500,7 @@ func encodeWebPBinary(img image.Image, targetBytes int) []byte { return buf.Bytes() } - low, high := 50, 80 + low, high := 1, 80 var best []byte for low <= high { mid := (low + high) / 2