이번에는 이미지 자르기를 위한 Vue-croper를 가져오겠습니다. Vue-croper로 이미지를 자를 때 주의사항은 무엇인가요?
1: 자르기 아이디어:
1-1, 자르기 영역: 자르기가 필요한 경우 먼저 자르기 영역을 형성해야 합니다. 자르기 영역의 크기는 마우스가 이동하는 거리와 관련이 있습니다. , 마우스가 얼마나 멀리 움직이는지, 자르기 영역이 그만큼 커집니다. 아래 그림과 같이:
1-2 자르기 영역의 너비와 높이 계산:
위 그림과 같이 마우스의 가로 이동 거리와 세로 이동 거리가 너비와 높이를 형성합니다. 자르기 영역의 높이. 그러면 자르기 영역의 너비와 높이가 계산됩니다. 마우스를 클릭하면 이벤트 이벤트
객체인 e.clientX 및 e.clientY를 통해 마우스 클릭 위치를 얻을 수 있습니다. 또한 이벤트를 통해 마우스 클릭 위치를 얻습니다. 마우스 위치를 가져옵니다. 마우스 위치를 두 번 변경하면 마우스가 이동한 거리를 얻을 수 있습니다. 즉, 초기 x축 위치는 initX = e.clientX, initY = e.clientY;
특정 지점으로 이동된 위치는 다음과 같습니다. endX = e.clientX, endY = e.clientY;
그래서 너비는 자르기 영역의 Tx = endX - initX;
잘라내기 영역의 높이는 Ty = endY - initY;
1-3 그림자 영역의 형성
그림에서 자르기 영역을 제외하고 우리가 자르는 부분은 다음과 같습니다. 그림자 부분. 아래 그림과 같이:
그럼 그림자 영역을 계산하는 방법은 무엇입니까? 예를 들어, 왼쪽 그림자의 너비 = 자르기 영역의 왼쪽 오프셋 값 - 그림 자체의 왼쪽 오프셋 값, 위쪽 그림자 높이 = 자르기 영역의 위쪽 오프셋 값 - 그림의 위쪽 오프셋 값 , 다음 그림과 같이:
아래쪽 그림자의 높이 = 그림 자체의 높이 - 위쪽 그림자의 높이 - 자르기 영역의 높이, 오른쪽 그림자의 너비 = 그림의 너비 - 왼쪽 그림자의 너비 - 자르기 영역의 너비.
1-4 자르기 영역이 범위를 벗어났다는 점을 이해하세요
사진을 자르는 과정에서 범위를 벗어난 상황이 발생하며, 범위를 벗어난 상황은 두 가지 상황으로 나누어야 합니다. 첫 번째는 자르기 과정에서 범위를 벗어나는 것이고, 두 번째는 자르기 영역을 위반하는 것입니다.
1-4-1 범위를 벗어난 자르기
자르기에서 범위를 벗어난 것이 무엇인가요? 즉, 이미지의 너비와 높이를 벗어나 자르기 위해 영역을 드래그하기 위해 마우스를 사용하면 아래 그림과 같이 범위를 벗어났습니다.
이런 종류의 범위를 벗어나면, 브라우저의 왼쪽을 기준으로 잘린 영역의 오른쪽을 판단해야 합니다. 위치는 브라우저의 왼쪽을 기준으로 한 이미지의 오른쪽 위치와 하단 위치를 초과할 수 없습니다. 아래 그림과 같이 브라우저 상단을 기준으로 잘린 영역의 크기는 브라우저 상단을 기준으로 이미지 하단의 위치를 초과할 수 없습니다. 표시:
범위 밖으로 이동한다는 것은 자르기 영역이 형성되었다는 의미인데, 마우스로 해당 영역을 자르면 경계를 넘는 것입니다. 사실 판단원리는 경계를 끊는 원칙과 동일하다.
이미지 너비가 컨테이너 너비보다 큰 경우 압축을 수행해야 합니다. 따라서 var scale = 컨테이너 너비/이미지 너비 이미지 높이 * 배율 비율 > ; 컨테이너의 높이, 스케일링 비율 scale = 컨테이너의 높이/이미지의 높이, 그렇지 않으면 압축이 수행되지 않습니다.
2-1: 압축 후 Translate3d의 X축 및 Y축 이동 위치 계산 방법:
x = 컨테이너 너비/압축 비율
y = 컨테이너 높이/압축 비율
That is:Transform:translate3d(x,y,z) ->translate3d(컨테이너의 너비/압축 비율 + 'px', 컨테이너의 높이/압축 비율 + 'px', 0)
그래서 페이지 레이아웃은 다음과 같습니다.
nbsp;html> <title>图片裁剪</title> <meta> <meta> <link> <p> </p><p> </p><p> </p><p> <img src="/static/imghwm/default1.png" data-src="https://images2018.cnblogs.com/blog/561794/201804/561794-20180416230443389-1451524334.jp" class="lazy" alt="Vue-croper 이미지 자르기" > </p> <p></p>
4. 자르기 과정에서 잘린 너비와 높이를 어떻게 계산하나요?
当我们点下鼠标时,就能够通过event事件对象获取鼠标点击位置,e.clientX 和 e.clientY; 当鼠标进行移动的时候,也能通过event获取鼠标的位置,
通过两次鼠标位置的改变,就能够获得鼠标移动的距离。即:
初始的x轴和Y轴位置分别为 cropX = e.clientX, cropY = e.clientY;
移动后现在的X轴和Y轴的位置分别为:nowX = e.clientX, nowY = e.clientY;
因此裁剪区域的临时值 var fw = ~~(nowX - cropX);
裁剪区域的临时值是 fh = ~~(nowY - cropY);
裁剪图片的时候,有可能往右拖动(值会越来越大),也有可能往相反的方向(向左)拖动(值会越来越小),同理,向上或向下拖动也是同一个道理。因此需要判断 fw 和 fh是否大于0的判断;在鼠标按键下去的时候,先获取鼠标相对于事件源元素的X和Y轴坐标,e.offsetX 和 e.offsetY;
因此 cropChangeX = e.offsetX; cropChangeY = e.offsetY;
对于offsetX 和 offsetY 的理解如下;
if (fw > 0) { var cropW(裁剪区域的实际宽度) = cropChangeX + fw > w(图片的实际宽度) ? w - cropChangeX : fw; cropOffsertX = cropChangeX; }
cropOffsertX 就是保存事件源相对于元素的距离。
如果fw 小于0,说明是往左裁剪,那么裁剪的距离 fw = (事件结束的clientX - 事件的开始clientX);
如果 (图片的实际宽度 - e.offsetX) + Math.abs(fw) > 图片的实际宽度 ? this.cropChangeX : Math.abs(fw);
即:
if (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
即:
if (fw > 0) { var cropOffsertX = cropChangeX } else { var cropOffsertX = cropChangeX - cropW } fw > 0 说明是往右移动,因此 cropOffsertX = cropChangeX; fw h) { cropH(裁剪区域的高度) = h - cropOffsertY; cropW(裁剪区域的宽度) = ~~(cropH / fixedNumber[1] * fixedNumber[0]); if (fw > 0) { var cropOffsertX = cropChangeX } else { var cropOffsertX = cropChangeX - cropW } } else { // 否则 cropH = fixedHeight; }
6. 理解裁剪区域拉伸原理
控制裁剪区域拉伸的点,共有12种可以拉伸的点,分别有裁剪区域的四根线可以拉伸,有四根线上的八个点可以拉伸;如下图所示:
当鼠标点击拉伸的时候,会触发mousedown事件;因此需要区分下到底是那根线或那个点向什么方向拉伸。因此定义 canChangeX 和 canChangeY 两个变量,
判断是否能改变X轴和Y轴;默认是false;同时定义两个变量为 changeCropTypeX 和 changeCropTypeY,含义是能否改变x轴或Y轴的基准点。默认为1;可以改变。
1. 裁剪区域的最上面的线; 可以上下拉伸, 不能左右拉伸;
因此可以约定: canChangeX = false, canChangeY = true; changeCropTypeX = 0; changeCropTypeY = 1;
2. 裁剪区域左边的线;可以左右拉伸,不能上下拉伸;
因此可以约定:canChangeX = true, canChangeY = false; changeCropTypeX = 1; changeCropTypeY = 0;
3. 裁剪区域底部线; 可以上下拉伸,不能左右拉伸;
因此可以约定:canChangeX = false; canChangeY = true; changeCropTypeX = 0; changeCropTypeY = 2;(为了区分上面的线,因此等于2);
4. 裁剪区域右边线;可以左右拉伸,不能上下拉伸;
因此可以约定:canChangeX = true; canChangeY = false; changeCropTypeX = 2;(为了区分左边的线) changeCropTypeY = 0;
5. 左上角的点;可以向上或向左移动;
因此 canChangeX = true, canChangeY = true; changeCropTypeX = 1; changeCropTypeY = 1;
6. 上面中间的点,只能上下拉伸,不能左右拉伸;
因此 canChangeX = false, canChangeY = true; changeCropTypeX = 0; changeCropTypeY = 1;
7. 右上角的点,可以左右拉伸和上下拉伸;
因此 canChangeX = true, canChangeY = true; changeCropTypeX = 2; changeCropTypeY = 1;
8. 左中角的点,只能左右拉伸,不能上下拉伸;
因此 canChangeX = true, canChangeY = false; changeCropTypeX = 1; changeCropTypeY = 0;
9. 右中角的点,只能左右拉伸,不能上下拉伸;
因此 canChangeX = true, canChangeY = false; changeCropTypeX = 2; changeCropTypeY = 0;
10. 左下角的点,可以向上或向左移动;
因此 canChangeX = true, canChangeY = true; changeCropTypeX = 1; changeCropTypeY = 2;
11. 下线中间的店,可以上下拉伸,不能左右拉伸;
因此 canChangeX = false, canChangeY = true; changeCropTypeX = 0; changeCropTypeY = 2;
12. 下右角点,可以上下拉伸,左右拉伸;
因此 canChangeX = true, canChangeY = true; changeCropTypeX = 2; changeCropTypeY = 2;
下面来看看移动操作;
var fw = ~~(移动结束的clientX - 初始的clientX); var fh = ~~(移动结束的clientY - 初始的clientY);
6-1 向左或向右拉伸的基本原理:
if (canChangeX) { // 如果x轴能改变的话,说明是 裁剪区域中左右两根线或是左右两个线上的点了。 if (changeCropTypeX === 1) { // 如果x轴的基点能改变的话,并且等于1,说明是裁剪区域左边的线或左边线上的点了。 // 那就有四种可能值,1. 左边的线,2. 左上角的点,3. 左中角的点。 4. 左下角的点。 } else if (changeCropTypeX === 2) { // 同理,说明是裁剪区域右边的线或右边线上的点了。 // 那也有四种可能值,1. 右边的线,2. 右上角的点,3. 右中角的点。4. 右下角的点。 } }
changeCropTypeX === 1 的情况;继续如下判断:
假设裁剪区域的原始宽度为 cropOldW,裁剪区域的原始高度为 cropOldY, cropChangeX 保存原始的裁剪区域相对于图片的e.offsetX;
if (cropOldW - fw > 0) { 如果裁剪区域的原始宽度 大于 移动的距离的话,那么说明两点,第一是向左拉伸的话,fw为负数,第二是向右拉伸,但是拉伸的距离小于裁剪区域的原始宽度 裁剪区域后的宽度 = 图片的宽度 - 拉伸前的offsetX - 拉伸的距离 <p style="text-align: left;">不管向左拉还是向右拉,裁剪区后的宽度 都等于 = 拉伸前的offsetX(cropChangeX) - 拉伸的距离;</p><p style="text-align: left;">裁剪后的 cropOffsertX = 裁剪区域前的offsertX(cropChangeX) + 拉伸的距离; 如下图所示:</p><p style="text-align: left;"><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/002/bb0d95fdc559be8871b0db805adc370b-10.jpg?x-oss-process=image/resize,p_40" class="lazy" alt=""></p><pre class="brush:php;toolbar:false">if (cropOldW - fw <p style="max-width:90%">如下图所示:</p><p style="text-align: left;"><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/002/bb0d95fdc559be8871b0db805adc370b-11.jpg?x-oss-process=image/resize,p_40" class="lazy" alt=""></p><p style="max-width:90%">changeCropTypeX === 2 的情况;</p><p style="text-align: left;">说明是裁剪区域右边的线或右边线上的点拉伸了。那也有四种可能值,1. 右边的线,2. 右上角的点,3. 右中角的点。4. 右下角的点。</p><p style="text-align: left;">同理;右边的线拉伸也有向左拉伸和向右拉伸,如果向左拉伸的话,那么fw肯定为负数,如果向右拉伸的话,那么fw就为正数。</p><pre class="brush:php;toolbar:false">if (cropOldW + fw > 0) { // 如果原始的裁剪区域的宽度 + 拉伸的距离大于0,说明是向右拉伸或者向左拉伸,但是向左拉伸的距离小于原始裁剪区域 if (裁剪区域的原始宽度 + 移动距离fw + cropOffsertX <p style="text-align: left;">这里的 裁剪区域的原始宽度 + 移动距离fw + cropOffsertX </p><p style="text-align: left;">也就是说拉伸的距离没有到图片的最右边;</p><p style="text-align: left;">现在的图片裁剪区域宽度(cropW) = 图片的原始区域的宽度 + fw(拉伸的距离,向左拉伸或向右拉伸);</p><p style="text-align: left;">否则的话,也就是说拉伸到最右边了,那么 图片裁剪区域宽度(cropW) = 图片的宽度 - 裁剪区域拉伸前的cropOffsertX;</p><pre class="brush:php;toolbar:false">因此此时 cropOffsertX = 拉伸前的裁剪区域的offsetX(cropChangeX); }
如下图所示:
if (cropOldW + fw <p style="max-width:90%">这边向左拉伸的距离又可以分为2种情况,第一种是 向左拉伸的距离 小于 (原始裁剪区域 + 拉伸前的offsetX); 第二种就是向左拉伸的时候越界了,</p><p style="text-align: left;">那么让拉伸后的宽度还控制在 offsetX的宽度即可,即不越界;因此如下逻辑判断:</p><p style="text-align: left;">现在图片裁剪区域的宽度(cropW) = (图片的宽度w - 拉伸前的offsetX + Math.abs(拉伸的总距离 + 裁剪前的原始距离)) </p><p style="text-align: left;"><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/002/bc6861685c91f68c1220d636875b8628-13.jpg?x-oss-process=image/resize,p_40" class="lazy" alt=""></p><p style="max-width:90%">6-2 向上或向下拉伸的基本原理</p><pre class="brush:php;toolbar:false">if (canChangeY) { // 如果Y轴能改变的话,说明是 裁剪区域中上下两根线或是上下两个线上的点了。 if (this.changeCropTypeY === 1) { // 如果Y轴的基点能改变的话,并且等于1,说明是裁剪区域上边的线或上边线上的点了。 // 那就有四种可能值,1. 上边的线,2. 上左角的点,3. 上中角的点。 4. 上右角的点。 } else if(this.changeCropTypeY === 2) { // 等于2,说明是裁剪区域下边的线或下边线上的点了。 // 同理也就有四种可能值,1. 下边的线,2. 下左角的点,3. 下中角的点。 4. 下右角的点。 } }
changeCropTypeY === 1 的情况;
假设裁剪区域的原始宽度为 cropOldH,裁剪区域的原始高度为 cropOldY, cropChangeY 保存原始的裁剪区域相对于图片的e.offsetY,
向上或向下拉伸的距离为fh.
如果是向下拉伸的话,又分为2种情况,第一种是向下拉伸它的距离不超过原始裁剪区域的高度 cropOldH, 第二种是已经超过它的原始裁剪区域的高度了。
if (原始裁剪区域的高度cropOldH - 拉伸的距离fh > 0) { // 说明是向上拉伸(fw肯定为负数)或向下拉伸(fw肯定为正数),但是向下拉伸的距离不超过原裁剪区域的高度 裁剪区域后的高度cropH 计算又分为2种情况,第一种是向上拉伸的距离fh小于或等于拉伸前的 e.offsetY, 第二种拉伸距离是大于e.offsetY,也就是向上 拉伸的时候越界了, 如果越界了,那么拉伸后的高度 = 裁剪之前的原始高度 + e.offsetY(裁剪区域之前的offsetY);因此: 裁剪区域后的高度cropH = 图片的高度 - e.offsetY(裁剪区域之前的offsetY) - fh <p style="text-align: left;">如下图所示:</p><p style="text-align: left;"><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/002/bc6861685c91f68c1220d636875b8628-14.jpg?x-oss-process=image/resize,p_40" class="lazy" alt=""></p><pre class="brush:php;toolbar:false">if (原始裁剪区域的高度cropOldH - 拉伸的距离fh <p style="max-width:90%">如下图所示:</p><p style="text-align: left;"><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/002/bc6861685c91f68c1220d636875b8628-15.jpg?x-oss-process=image/resize,p_40" class="lazy" alt=""></p><p style="max-width:90%">changeCropTypeY === 2 的情况</p><p style="text-align: left;">等于2,说明是裁剪区域下边的线或下边线上的点了。</p><pre class="brush:php;toolbar:false">if (原裁剪区域的高度 + 被拉伸的距离fh > 0) { // 说明了有可能是向下拉伸,或向上拉伸,但是向上拉伸的距离小于原裁剪区域的高度 裁剪区域后的高度 = 原裁剪区域的高度 + 被拉伸的距离fh + 原始裁剪区域的offsetY <p style="text-align: left;">如下图所示:</p><p style="text-align: left;"><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/002/bc6861685c91f68c1220d636875b8628-16.jpg?x-oss-process=image/resize,p_40" class="lazy" alt=""></p><pre class="brush:php;toolbar:false">if (原裁剪区域的高度 + 被拉伸的距离fh <p style="max-width:90%">如下图所示:</p><p style="text-align: left;"><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/002/bc6861685c91f68c1220d636875b8628-17.jpg?x-oss-process=image/resize,p_40" class="lazy" alt=""></p><p style="max-width:90%">6-3: 向左或向右拉伸且是固定比例拉伸,假设固定比例 3:4, 即 fixedNumber = [3, 4];</p><p style="text-align: left;">向左或向右拉伸,高度会随着变化。如下图所示:</p><p style="text-align: left;"><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/002/ecd72b06b08c4da2c3035c2b1fe67e12-18.jpg?x-oss-process=image/resize,p_40" class="lazy" alt=""></p><pre class="brush:php;toolbar:false">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);
如下图所示:
if (移动后的距离fw小于或等于1的话) { 移动后的cropOffsertX = 1; } else if ((移动后的距离 + 裁剪区域的宽度) > 图片的宽度的话) { // 说明移动的裁剪区域越界了,那么就让裁剪区处于中间的位置 移动后的cropOffsertX = 图片的宽度 - 裁剪区的宽度 - 1; }
如下图所示:
else { 移动后的cropOffsertX = fw; } 同理 if (移动后的距离fh小于或等于1的话) { 移动后的cropOffsertY = 1; } else if ((移动后的距离 + 裁剪区域的高度) > 图片的高度的话) { // 说明移动的裁剪区域越界了,那么就让裁剪区处于中间的位置 移动后的cropOffsertY = 图片的高度 - 裁剪区的高度 - 1; } else { 移动后的cropOffsertY = fh; }
8. 自动截图操作
代码的基本原理是:看组件是否传递了 autoCropWidth 和 autoCropHeight, 如果传递了该参数的宽度和高度的话,那么使用该参数的值,
如果没有传递的话,或者说该宽度和高度的值都为0的话,那么截取的宽度和高度就是图片的宽度和高度的80%;如果传递的宽度w和高度h大于图片的
本身的宽度或高度的话,那么宽度或高度的值就是图片的本身的宽度和高度的值。
如果传递了固定比例的话,那么高度的计算是根据宽度的比例来计算出来的。计算方式还是之前一样的:如下:
w fixedNumber[0] ------------- = --------------- h fixedNumber[1]
因此 h = w / this.fixedNumber[0] * this.fixedNumber[1]
如果高度大于图片的高度的话,那么高度就是等于图片的高度,然后根据现在的高度重新计算宽度;
代码如下:
// 如果比例之后 高度大于h if (h > this.h) { h = this.h w = h / this.fixedNumber[1] * this.fixedNumber[0] }
自动截图的主要代码如下:
var w = this.autoCropWidth var h = this.autoCropHeight if (w === 0 || h === 0) { w = this.w * 0.8 h = this.h * 0.8 } w = w > this.w ? this.w : w h = h > this.h ? this.h : h if (this.fixed) { h = w / this.fixedNumber[0] * this.fixedNumber[1] } // 如果比例之后 高度大于h if (h > this.h) { h = this.h w = h / this.fixedNumber[1] * this.fixedNumber[0] }
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
위 내용은 Vue-croper 이미지 자르기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

Python은 부드러운 학습 곡선과 간결한 구문으로 초보자에게 더 적합합니다. JavaScript는 가파른 학습 곡선과 유연한 구문으로 프론트 엔드 개발에 적합합니다. 1. Python Syntax는 직관적이며 데이터 과학 및 백엔드 개발에 적합합니다. 2. JavaScript는 유연하며 프론트 엔드 및 서버 측 프로그래밍에서 널리 사용됩니다.

Python과 JavaScript는 커뮤니티, 라이브러리 및 리소스 측면에서 고유 한 장점과 단점이 있습니다. 1) Python 커뮤니티는 친절하고 초보자에게 적합하지만 프론트 엔드 개발 리소스는 JavaScript만큼 풍부하지 않습니다. 2) Python은 데이터 과학 및 기계 학습 라이브러리에서 강력하며 JavaScript는 프론트 엔드 개발 라이브러리 및 프레임 워크에서 더 좋습니다. 3) 둘 다 풍부한 학습 리소스를 가지고 있지만 Python은 공식 문서로 시작하는 데 적합하지만 JavaScript는 MDNWebDocs에서 더 좋습니다. 선택은 프로젝트 요구와 개인적인 이익을 기반으로해야합니다.

C/C에서 JavaScript로 전환하려면 동적 타이핑, 쓰레기 수집 및 비동기 프로그래밍으로 적응해야합니다. 1) C/C는 수동 메모리 관리가 필요한 정적으로 입력 한 언어이며 JavaScript는 동적으로 입력하고 쓰레기 수집이 자동으로 처리됩니다. 2) C/C를 기계 코드로 컴파일 해야하는 반면 JavaScript는 해석 된 언어입니다. 3) JavaScript는 폐쇄, 프로토 타입 체인 및 약속과 같은 개념을 소개하여 유연성과 비동기 프로그래밍 기능을 향상시킵니다.

각각의 엔진의 구현 원리 및 최적화 전략이 다르기 때문에 JavaScript 엔진은 JavaScript 코드를 구문 분석하고 실행할 때 다른 영향을 미칩니다. 1. 어휘 분석 : 소스 코드를 어휘 단위로 변환합니다. 2. 문법 분석 : 추상 구문 트리를 생성합니다. 3. 최적화 및 컴파일 : JIT 컴파일러를 통해 기계 코드를 생성합니다. 4. 실행 : 기계 코드를 실행하십시오. V8 엔진은 즉각적인 컴파일 및 숨겨진 클래스를 통해 최적화하여 Spidermonkey는 유형 추론 시스템을 사용하여 동일한 코드에서 성능이 다른 성능을 제공합니다.

실제 세계에서 JavaScript의 응용 프로그램에는 서버 측 프로그래밍, 모바일 애플리케이션 개발 및 사물 인터넷 제어가 포함됩니다. 1. 서버 측 프로그래밍은 Node.js를 통해 실현되며 동시 요청 처리에 적합합니다. 2. 모바일 애플리케이션 개발은 재교육을 통해 수행되며 크로스 플랫폼 배포를 지원합니다. 3. Johnny-Five 라이브러리를 통한 IoT 장치 제어에 사용되며 하드웨어 상호 작용에 적합합니다.

일상적인 기술 도구를 사용하여 기능적 다중 테넌트 SaaS 응용 프로그램 (Edtech 앱)을 구축했으며 동일한 작업을 수행 할 수 있습니다. 먼저, 다중 테넌트 SaaS 응용 프로그램은 무엇입니까? 멀티 테넌트 SAAS 응용 프로그램은 노래에서 여러 고객에게 서비스를 제공 할 수 있습니다.

이 기사에서는 Contrim에 의해 확보 된 백엔드와의 프론트 엔드 통합을 보여 주며 Next.js를 사용하여 기능적인 Edtech SaaS 응용 프로그램을 구축합니다. Frontend는 UI 가시성을 제어하기 위해 사용자 권한을 가져오고 API가 역할 기반을 준수하도록합니다.

JavaScript는 현대 웹 개발의 핵심 언어이며 다양성과 유연성에 널리 사용됩니다. 1) 프론트 엔드 개발 : DOM 운영 및 최신 프레임 워크 (예 : React, Vue.js, Angular)를 통해 동적 웹 페이지 및 단일 페이지 응용 프로그램을 구축합니다. 2) 서버 측 개발 : Node.js는 비 차단 I/O 모델을 사용하여 높은 동시성 및 실시간 응용 프로그램을 처리합니다. 3) 모바일 및 데스크탑 애플리케이션 개발 : 크로스 플랫폼 개발은 개발 효율을 향상시키기 위해 반응 및 전자를 통해 실현됩니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

맨티스BT
Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기
