From 750d90ee0b4a6344d01e374d3dc46037fc5a566f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E9=B9=8F?= <2916022834@qq.com> Date: Wed, 21 Jan 2026 13:37:50 +0800 Subject: [PATCH] =?UTF-8?q?=E7=9E=8E=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CanvasEditor/commands/RedGreenCommands.js | 2 + src/component/Canvas/CanvasEditor/index.vue | 40 +++++++++---------- .../CanvasEditor/managers/CanvasManager.js | 2 +- .../Canvas/CanvasEditor/utils/imageHelper.js | 7 +++- 4 files changed, 29 insertions(+), 22 deletions(-) diff --git a/src/component/Canvas/CanvasEditor/commands/RedGreenCommands.js b/src/component/Canvas/CanvasEditor/commands/RedGreenCommands.js index 9b3ffaa6..56638c2f 100644 --- a/src/component/Canvas/CanvasEditor/commands/RedGreenCommands.js +++ b/src/component/Canvas/CanvasEditor/commands/RedGreenCommands.js @@ -159,6 +159,8 @@ export class BatchInitializeRedGreenModeCommand extends Command { absolutePositioned: true, opacity: 0.01, // 设置为几乎透明 id: generateId("redGreenImageMask_"), + rx: 15, + ry: 15, }); // this.canvas.add(this.redGreenImageMask); this.canvas.clipPath = this.redGreenImageMask; diff --git a/src/component/Canvas/CanvasEditor/index.vue b/src/component/Canvas/CanvasEditor/index.vue index 7c6efd7c..d28d8d06 100644 --- a/src/component/Canvas/CanvasEditor/index.vue +++ b/src/component/Canvas/CanvasEditor/index.vue @@ -503,7 +503,7 @@ onMounted(async () => { clearTimeout(trailingTimeout); trailingTimeout = setTimeout(() => { optimizeCanvasRendering(canvasManager.canvas, ()=> handleWindowResize()); - }, 200); + }, 1000); }); observer.observe(canvasContainerRef.value); // 使用window的resize事件代替ResizeObserver @@ -566,38 +566,38 @@ async function handleWindowResize() { if(!canvasManager) return; await updateCanvasSize(); // 确保显示的缩放信息是最新的 - currentZoom.value = Math.round(canvasManager.canvas.getZoom() * 100); - setInitZoom(); + await setInitZoom(); await new Promise(requestAnimationFrame); await layerManager?.updateLayersObjectsInteractivity?.(); } -function setInitZoom(){ - if (props.config.initZoom) { +async function setInitZoom(){ + if (props.config.initZoom && !props.enabledRedGreenMode) { const width = canvasManager.width; const height = canvasManager.height; - const cwidth = props.config.width; - const cheight = props.config.height; + const cwidth = canvasWidth.value; + const cheight = canvasHeight.value; let zoom = Math.min(1, width / cwidth, height / cheight); if (zoom < 1) zoom -= 0.05; - setZoom(zoom); // 设置画布缩放 + await setZoom(zoom); // 设置画布缩放 + }else{ + currentZoom.value = Math.round(canvasManager.canvas.getZoom() * 100); } } function resetZoom() { canvasManager.resetZoom(); } -function setZoom(zoom) { - setTimeout(() => { - if (!canvasManager) return; - const newZoom = Math.max(zoom, 0.1); - // 使用画布中心作为缩放点 - const centerPoint = { - x: canvasManager.canvas.width / 2, - y: canvasManager.canvas.height / 2, - }; - canvasManager.animateZoom(centerPoint, newZoom); - }); +async function setZoom(zoom) { + await new Promise(requestAnimationFrame); + if (!canvasManager) return; + const newZoom = Math.max(zoom, 0.1); + // 使用画布中心作为缩放点 + const centerPoint = { + x: canvasManager.canvas.width / 2, + y: canvasManager.canvas.height / 2, + }; + canvasManager.animateZoom(centerPoint, newZoom); } function zoomIn() { @@ -1467,7 +1467,7 @@ defineExpose({ position: absolute; } -.background-grid { +.canvas-container { --offsetX: 50%; --offsetY: 50%; --size: 10px; diff --git a/src/component/Canvas/CanvasEditor/managers/CanvasManager.js b/src/component/Canvas/CanvasEditor/managers/CanvasManager.js index bf7ea1a6..0852fa1c 100644 --- a/src/component/Canvas/CanvasEditor/managers/CanvasManager.js +++ b/src/component/Canvas/CanvasEditor/managers/CanvasManager.js @@ -1390,7 +1390,7 @@ export class CanvasManager { // 重置画布数据 await this.setCanvasSize(this.canvas.width, this.canvas.height); await this.centerBackgroundLayer(this.canvas.width, this.canvas.height); - await this.resetCanvasSizeByFixedLayer(); + // await this.resetCanvasSizeByFixedLayer(); // 重新构建对象关系 // restoreObjectLayerAssociations(this.layers.value, this.canvas.getObjects()); // 验证图层关联关系 - 稳定后可以注释 diff --git a/src/component/Canvas/CanvasEditor/utils/imageHelper.js b/src/component/Canvas/CanvasEditor/utils/imageHelper.js index 15bd7bf6..47897fc9 100644 --- a/src/component/Canvas/CanvasEditor/utils/imageHelper.js +++ b/src/component/Canvas/CanvasEditor/utils/imageHelper.js @@ -2208,8 +2208,13 @@ export const resizeImage = async (base64, width, height) => { const canvas = document.createElement("canvas"); canvas.width = width; canvas.height = height; + const scale = height / img.height; + const w = img.width * scale; + const h = img.height * scale; + const x = (width - w) / 2; + const y = 0; const ctx = canvas.getContext("2d"); - ctx.drawImage(img, 0, 0, width, height); + ctx.drawImage(img, x, y, w, h); resolve(canvas.toDataURL()); }; img.onerror = reject;