feat(画布): 添加图片旋转和镜像变换支持
新增 drawImageWithTransform 函数处理图片的旋转和镜像变换,修改图片绘制逻辑以支持这些效果
This commit is contained in:
39
js/script.js
39
js/script.js
@@ -2479,15 +2479,25 @@
|
|||||||
|
|
||||||
ctx.globalAlpha = overlayEl.style.opacity || 1;
|
ctx.globalAlpha = overlayEl.style.opacity || 1;
|
||||||
|
|
||||||
|
// 获取旋转角度
|
||||||
|
const overlayTransform = overlayEl.style.transform || '';
|
||||||
|
const rotateMatch = overlayTransform.match(/rotate\(([-\d.]+)deg\)/);
|
||||||
|
const rotateDeg = rotateMatch ? parseFloat(rotateMatch[1]) : 0;
|
||||||
|
|
||||||
|
// 获取镜像状态
|
||||||
|
const imgTransform = imgEl.style.transform || '';
|
||||||
|
const isMirroredH = imgTransform.includes('scaleX(-1)');
|
||||||
|
const isMirroredV = imgTransform.includes('scaleY(-1)');
|
||||||
|
|
||||||
// 直接使用已加载的图片元素,避免重新加载导致质量下降
|
// 直接使用已加载的图片元素,避免重新加载导致质量下降
|
||||||
if (imgEl.complete && imgEl.naturalWidth > 0) {
|
if (imgEl.complete && imgEl.naturalWidth > 0) {
|
||||||
ctx.drawImage(imgEl, left, top, width, height);
|
drawImageWithTransform(ctx, imgEl, left, top, width, height, rotateDeg, isMirroredH, isMirroredV);
|
||||||
ctx.globalAlpha = 1;
|
ctx.globalAlpha = 1;
|
||||||
checkComplete();
|
checkComplete();
|
||||||
} else {
|
} else {
|
||||||
// 如果图片未加载完成,等待加载
|
// 如果图片未加载完成,等待加载
|
||||||
imgEl.onload = () => {
|
imgEl.onload = () => {
|
||||||
ctx.drawImage(imgEl, left, top, width, height);
|
drawImageWithTransform(ctx, imgEl, left, top, width, height, rotateDeg, isMirroredH, isMirroredV);
|
||||||
ctx.globalAlpha = 1;
|
ctx.globalAlpha = 1;
|
||||||
checkComplete();
|
checkComplete();
|
||||||
};
|
};
|
||||||
@@ -2500,6 +2510,31 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 绘制带旋转和镜像变换的图片
|
||||||
|
function drawImageWithTransform(ctx, img, x, y, width, height, rotateDeg, isMirroredH, isMirroredV) {
|
||||||
|
ctx.save();
|
||||||
|
|
||||||
|
// 移动到图片中心点
|
||||||
|
const centerX = x + width / 2;
|
||||||
|
const centerY = y + height / 2;
|
||||||
|
ctx.translate(centerX, centerY);
|
||||||
|
|
||||||
|
// 应用旋转
|
||||||
|
if (rotateDeg !== 0) {
|
||||||
|
ctx.rotate(rotateDeg * Math.PI / 180);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 应用镜像
|
||||||
|
let scaleX = isMirroredH ? -1 : 1;
|
||||||
|
let scaleY = isMirroredV ? -1 : 1;
|
||||||
|
ctx.scale(scaleX, scaleY);
|
||||||
|
|
||||||
|
// 绘制图片(从中心点偏移一半宽高)
|
||||||
|
ctx.drawImage(img, -width / 2, -height / 2, width, height);
|
||||||
|
|
||||||
|
ctx.restore();
|
||||||
|
}
|
||||||
|
|
||||||
// 在画布上绘制文字
|
// 在画布上绘制文字
|
||||||
function drawTextOnCanvas(ctx, inputElement) {
|
function drawTextOnCanvas(ctx, inputElement) {
|
||||||
const deleteBtn = inputElement.querySelector('.text-delete-btn');
|
const deleteBtn = inputElement.querySelector('.text-delete-btn');
|
||||||
|
|||||||
Reference in New Issue
Block a user