From 95c6b53f10379535fa4e328e373d4e6391cc9710 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Tue, 20 Jan 2026 14:52:57 +0000 Subject: [PATCH] =?UTF-8?q?fix(ai-assistant):=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=9B=BE=E7=89=87=E5=8E=8B=E7=BC=A9=E9=80=BB=E8=BE=91=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E9=87=8D=E5=A4=8D=E8=B4=A8=E9=87=8F=E5=8E=8B=E7=BC=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 forceCompress 参数控制是否强制质量压缩 - compressImageForAI: 始终进行质量压缩(发送给 AI) - saveImageToCache: 仅在需要缩小尺寸时才压缩(避免已压缩图片被重复压缩) Co-Authored-By: Claude Opus 4.5 --- .../js/components/AIAssistant/index.vue | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/resources/assets/js/components/AIAssistant/index.vue b/resources/assets/js/components/AIAssistant/index.vue index 7fb0a971e..21e4f8624 100644 --- a/resources/assets/js/components/AIAssistant/index.vue +++ b/resources/assets/js/components/AIAssistant/index.vue @@ -1884,9 +1884,9 @@ export default { * @returns {Promise} - Base64 data URL (image/jpeg) */ async compressImageForAI(file) { - // File 转 dataUrl 后压缩到 1024px + // File 转 dataUrl 后压缩到 1024px,强制质量压缩 const dataUrl = await this.fileToDataUrl(file); - return this.resizeDataUrl(dataUrl, 1024); + return this.resizeDataUrl(dataUrl, 1024, true); }, /** @@ -1956,9 +1956,10 @@ export default { * 压缩 dataUrl 图片到指定尺寸 * @param {string} dataUrl - Base64 图片 * @param {number} maxSize - 最大边长 + * @param {boolean} forceCompress - 是否强制质量压缩(即使尺寸不变) * @returns {Promise} - 压缩后的 dataUrl */ - resizeDataUrl(dataUrl, maxSize) { + resizeDataUrl(dataUrl, maxSize, forceCompress = false) { return new Promise((resolve, reject) => { // 参数校验 if (!dataUrl || typeof dataUrl !== 'string') { @@ -1968,15 +1969,18 @@ export default { const img = new Image(); img.onload = () => { let {width, height} = img; - // 如果已经小于目标尺寸,直接返回原图 - if (width <= maxSize && height <= maxSize) { + const needResize = width > maxSize || height > maxSize; + // 如果不需要缩放且不强制压缩,直接返回原图 + if (!needResize && !forceCompress) { resolve(dataUrl); return; } // 计算缩放比例 - const ratio = Math.min(maxSize / width, maxSize / height); - width = Math.round(width * ratio); - height = Math.round(height * ratio); + if (needResize) { + const ratio = Math.min(maxSize / width, maxSize / height); + width = Math.round(width * ratio); + height = Math.round(height * ratio); + } // Canvas 压缩 const canvas = document.createElement('canvas'); canvas.width = width;