使用 canvas 居中裁剪图片

本文介绍了在开发中处理图片上传时,如何利用canvas进行居中裁剪,确保图片尺寸不超过预设限制。通过drawImage()方法,结合图片原始尺寸和目标裁剪尺寸,实现图片的居中裁剪。示例代码展示了从文件选择到裁剪、转换为blob并上传的完整流程。
摘要由CSDN通过智能技术生成

在日常开发中,想必不少小伙伴有涉及到图片上传的功能,今天我们就来捋一捋上传图片时,如果图片大于规定尺寸,用 canvas 居中裁剪。

首先我们来熟悉一下 canvasdrawImage()的用法:

drawImage()向画布上面绘制图片:

这里因为自己曾经掉过这个参数的坑,所以我解释下个别参数

1. width   要使用图片的宽度:就是裁剪完成后你想要的图片的宽度

2. height   要使用图片的高度:就是裁剪完成后你想要的图片的高度

裁剪主要是要掌握 drawImage 参数, 我们来看一张图理解下drawImage 参数:drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)

<input type="file" name="file" id="file" />
<canvas id="clipImg" style="border:1px solid red"></canvas>
<script>
  <input type="file" name="file" id="file" />
  <canvas id="clipImg" style="border:1px solid red"></canvas>
  <script>
    var eleFile = document.querySelector('#file');
    // 压缩图片需要的一些元素和对象
    var reader = new FileReader(), img = new Image();
    // 选择的文件对象
    var file = null;
    var canvas = document.getElementById('clipImg')
    var context = canvas.getContext('2d');

    // base64地址图片加载完毕后
    img.onload = function () {
      // 图片原始尺寸
      var originWidth = this.width;
      var originHeight = this.height;
      // 最终要裁剪到的尺寸
      var maxWidth = 120, maxHeight = 120;  //裁剪成120*120的大小
      //目标尺寸 targetWidth
      var targetWidth = originWidth, targetHeight = originHeight;
      // 先取最短边(长或者宽)
      let xStart, yStart    //开始裁剪x轴的坐标,和y轴的坐标
      if (originWidth > originHeight) {
        // 判断最短边,因为我们要裁的最终的图片是长宽相等的,所以裁剪时取最短的
        targetHeight = originHeight;
        targetWidth = originHeight;
        xStart = (originWidth - targetWidth) / 2   // 裁剪x轴的坐标,因为是居中裁剪,所以是取中间开始截取
        yStart = 0
      } else {
        targetHeight = originWidth;
        targetWidth = originWidth
        xStart = 0
        yStart = (originWidth - targetWidth) / 2
      }

      // 清除画布
      context.clearRect(0, 0, maxWidth, maxHeight);
      canvas.width = maxWidth
      canvas.height = maxHeight

      context.drawImage(img, xStart,yStart, targetWidth, targetHeight, 0, 0, maxWidth, maxHeight);
      // canvas转为blob并上传
      canvas.toBlob(function (blob) {
        console.log(blob, 'blob')
        // 转成blob,这里可以ajax上传到后台
      }, 'image/png');
    };

    // 文件base64化,以便获知图片原始尺寸
    reader.onload = function (e) {
      img.src = e.target.result;
    };
    eleFile.addEventListener('change', function (event) {
      file = event.target.files[0];
      // 选择的文件是图片
      if (file.type.indexOf("image") == 0) {
        reader.readAsDataURL(file);
      }
    });
  </script>

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值