Vue-cropper 图片裁剪的基本原理及思路讲解(3)
cropOffsertX 就是保存事件源相对于元素的距离。
如果fw 小于0,说明是往左裁剪,那么裁剪的距离 fw = (事件结束的clientX - 事件的开始clientX);
如果 (图片的实际宽度 - e.offsetX) + Math.abs(fw) > 图片的实际宽度 ? this.cropChangeX : Math.abs(fw);
即:
if (fw < 0) { var cropW(裁剪区域的实际宽度) = (w - cropChangeX) + Math.abs(fw) > w ? cropChangeX : Math.abs(fw); cropOffsertX = cropChangeX + fw > 0 ? cropChangeX + fw : 0; }
说明往左裁剪的最大宽度只能是 e.offsetX; 不能超过该值,否则的话,就会越界。
此时cropOffsertX偏移值改变了; cropOffsertX = cropChangeX + fw > 0 ? cropChangeX + fw : 0
; 如图下所示:
上面分析的是 宽和高不固定比例的裁剪,下面我们来看下 宽和高固定比例的裁剪。
5. 宽和高固定比例裁剪计算;
比如宽和高比是 3:4 这样的截图;fixedNumber = [3, 4]
因此 固定比例高度的计算
fixedHeight 裁剪区域的实际宽度
------------- = ---------------
fixedNumber[1] fixedNumber[0]
因此:
var fixedHeight = ~~(裁剪区域的实际宽度 / fixedNumber[0] * fixedNumber[1]);
如果固定比例的移动的高度 + Y轴上相对于图片的偏移值 > 大于图片的高度的话,那么裁剪区域的高度(cropH) = 图片的高度(h) - Y轴上相对于图片的偏移值(cropOffsertY); 如下图所示:
获取到了 裁剪区域的高度的话,就可以获取到裁剪区域的宽度了;计算方式是:
cropW(裁剪区域的宽度) = ~~(cropH / fixedNumber[1] * fixedNumber[0]);
同时也要判断fw 是否大于0,来计算 cropOffsertX 的值;
if (fw > 0) { var cropOffsertX = cropChangeX } else { var cropOffsertX = cropChangeX - cropW }
fw > 0 说明是往右移动,因此 cropOffsertX = cropChangeX;
fw < 0 说明是往左移动,cropOffsertX = 初始的 e.offsetX - 裁剪区域的宽度
即:
if (fw > 0) { var cropOffsertX = cropChangeX } else { var cropOffsertX = cropChangeX - cropW } fw > 0 说明是往右移动,因此 cropOffsertX = cropChangeX; fw < 0 说明是往左移动,cropOffsertX = 初始的 e.offsetX - 裁剪区域的宽度 即: if (fixedHeight + cropOffsertY > h) { cropH(裁剪区域的高度) = h - cropOffsertY; cropW(裁剪区域的宽度) = ~~(cropH / fixedNumber[1] * fixedNumber[0]); if (fw > 0) { var cropOffsertX = cropChangeX } else { var cropOffsertX = cropChangeX - cropW } } else { // 否则 cropH = fixedHeight; }
内容版权声明:除非注明,否则皆为本站原创文章。