深度画布bug

This commit is contained in:
lzp
2026-03-31 13:29:46 +08:00
parent f5efaa8eaf
commit b53d15d3f2
22 changed files with 381 additions and 91 deletions

View File

@@ -259,4 +259,41 @@ export function traceImageContour(canvas) {
);
return contour;
}
}
/** 裁剪画布透明像素 */
export function clipCanvasTransparent(canvas) {
const ctx = canvas.getContext("2d", { willReadFrequently: true });
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
const data = imageData.data;
const width = canvas.width;
const height = canvas.height;
var minX = width;
var minY = height;
var maxX = 0;
var maxY = 0;
for (let y = 0; y < height; y++) {
for (let x = 0; x < width; x++) {
const index = (y * width + x) * 4;
if (data[index + 3] > 0) {
if (x < minX) minX = x;
if (y < minY) minY = y;
if (x > maxX) maxX = x;
if (y > maxY) maxY = y;
}
}
}
const newCanvas = document.createElement("canvas");
newCanvas.width = maxX - minX + 1;
newCanvas.height = maxY - minY + 1;
const newCtx = newCanvas.getContext("2d");
newCtx.drawImage(canvas, minX, minY, maxX - minX + 1, maxY - minY + 1, 0, 0, maxX - minX + 1, maxY - minY + 1);
return {
minX,
minY,
maxX,
maxY,
canvas: newCanvas,
};
}

View File

@@ -1,8 +1,16 @@
import { fabric } from 'fabric-with-all'
import { createStaticCanvas } from './canvasFactory'
import { getObjectsBoundingBox, cloneObjects } from './canvasMethod'
/** 导出画布为图片 */
export async function exportCanvasToImage(canvas) {
/** 导出画布为图片
* @param {fabric.Canvas} canvas - 画布对象
* @param {boolean} isDisscar - 是否丢弃选中对象
* @returns {Promise<string>} - 图片URL
*/
export async function exportCanvasToImage(canvas, isDisscar = true) {
if (isDisscar) {
canvas.discardActiveObject()
canvas.renderAll()
}
const clonedObjects = await cloneObjects(canvas.getObjects())
const staticCanvas = createStaticCanvas(document.createElement('canvas'))
const width = canvas.clipPath.width