Vue-cropper 图片裁剪的基本原理及思路讲解(8)
如下图所示:
6-3: 向左或向右拉伸且是固定比例拉伸,假设固定比例 3:4, 即 fixedNumber = [3, 4];
向左或向右拉伸,高度会随着变化。如下图所示:
if (canChangeX && fixed) { 比如宽和高比是 3:4 这样的比例;fixedNumber = [3, 4] 因此 固定比例高度的计算 裁剪区域的高度 fixedNumber[1] ------------- = --------------- 裁剪区域的宽度 fixedNumber[0] 因此: var 裁剪区域的高度(fixedHeight) = ~~(裁剪区域的宽度 / fixedNumber[0] * fixedNumber[1]); if (裁剪区域的高度 + 原裁剪区域的offsetY > 图片的高度) { // 说明向左拉伸或向右拉伸,导致纵向区域越界了, 拉伸后的高度 = 图片的高度 - 原裁剪区域的offsetY; 拉伸后的宽度 3 ---------- = ---- 拉伸后的高度 4 拉伸后的宽度 = 拉伸后的高度 / fixedNumber[1] * fixedNumber[0]; } else { 拉伸后的高度 = fixedHeight; } }
同样的道理,如果Y轴上的上下线拉伸的话,宽度会跟着变化,也是一样的计算方式:
if (this.canChangeY && this.fixed) { 比如宽和高比是 3:4 这样的比例;fixedNumber = [3, 4]; 因此 固定比例宽度的计算 裁剪区域的高度 fixedNumber[1] ------------- = --------------- 裁剪区域的宽度 fixedNumber[0] 裁剪区域的宽度(fixedWidth) = ~~(裁剪区域的高度 / fixedNumber[1] * fixedNumber[0]); if (裁剪区域的宽度 + 原裁剪区域的offsetX > 图片的宽度) { // 说明向上或向下拉伸,横向区域越界了 拉伸后的宽度 = 图片的宽度 - 原裁剪区的offsetX; 拉伸后的宽度 3 ---------- = ---- 拉伸后的高度 4 拉伸后的高度 = 拉伸后的宽度 / fixedNumber[0] * fixedNumber[1]; } else { 拉伸后的宽度 = fixedWidth; } }
7. 截图移动操作
首先可以先获取原裁剪区域的offsetx,和 offsetY, 该offsetX和offsetY是相对于浏览器的,因此原坐标的x轴和Y轴的 e.clientx 和 e.clientY;
当鼠标移动裁剪区到一个新坐标的时候,会有一个新的 e.clientX 和 e.clientY; 把终点的x轴和Y轴离客户端的距离 - 起点的x轴和Y轴的距离,
就等于移动了多少的距离了,再加上原裁剪区相对于浏览器的 offsetX 或 offsetY后,就是最终相对于浏览器的坐标了;因此;
fw = 终点的x轴坐标(e.clientX) - 起点的x轴坐标(e.clientX) + 原裁剪区相对于浏览器的x轴坐标(offsetX);
fh = 终点的y轴坐标(e.clientY) - 起点的y轴坐标(e.clientY) + 原裁剪区相对于浏览器的y轴坐标(offsetY);
如下图所示: