From 8b075f738727d9ca4385cc0aaebd0617cf865dbc Mon Sep 17 00:00:00 2001 From: Victor_Jay Date: Sun, 31 May 2026 03:16:55 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20WebP=20=E4=BA=8C=E5=88=86=E5=8E=8B?= =?UTF-8?q?=E7=BC=A9=E4=B8=8B=E9=99=90=E4=BB=8E=2050=20=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=201=EF=BC=8C=E5=8C=B9=E9=85=8D=E5=8E=9F=E5=9B=BE=E5=AE=9E?= =?UTF-8?q?=E9=99=85=E8=B4=A8=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - encodeWebPBinary 质量区间从 50~80 扩大为 1~80 - 低质量原图自动匹配低质量 WebP,不再无故回退原格式 - 回退路径中 WebP 不再重编码,避免低质量 WebP 被 quality 80 撑大 - 回退路径仅对 JPEG/PNG 重编码剥离元数据 --- internal/controller/post_controller.go | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) 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