js+canvas实现图片裁剪

 html

 <canvas id="canvas" width="800" height="800" style="border: 1px solid #000;"></canvas>
  <input id="input" type="file">
  <button id="btn">确定裁剪</button>

javaScript

const canvas = document.getElementById("canvas")
    const ctx = canvas.getContext("2d")
    let image = null
    let starX = 0
    let starY = 0
    let endX = 0
    let endY = 0
    let isdraging = false
    // 图片加载
    const loadImage = (file) => {
      const reader = new FileReader()
      reader.readAsDataURL(file)
      reader.onload = (e) => {
        image = new Image()
        image.onload = () => {
          ctx.drawImage(image, 0, 0, 800, 800)
        }
        image.src = e.target.result
      }


    }
    // 选择图片
    const fileInput = document.getElementById("input")
    fileInput.addEventListener("change", (e) => {
      const file = e.target.files[0]
      loadImage(file)
    })
    // 选择绘制区域
    canvas.addEventListener("mousedown", (e) => {
      if (isdraging) return
      isdraging = true
      starX = e.offsetX
      starY = e.offsetY
      endX = starX
      endY = starY
    })
    // 绘制矩形
    canvas.addEventListener("mousemove", (e) => {
      if (!isdraging) return
      endX = e.offsetX
      endY = e.offsetY
      ctx.clearRect(0, 0, canvas.width, canvas.height) // 清除画布中所有矩形
      ctx.drawImage(image, 0, 0, 800, 800)
      // ctx.fillStyle = "rgba(0,0,0,.5)" // 矩形填充颜色
      ctx.lineWidth = "1"
      ctx.setLineDash([4, 2])
      ctx.lineDashOffset = 0
      ctx.strokeStyle = "pink"
      // ctx.fillRect(starX, starY, endX - starX, endY - starY)  // 画矩形
      ctx.strokeRect(starX, starY, endX - starX, endY - starY)
      // 绘制完成后需要将矩形之外的其他地方渲染为半透明颜色(4个矩形)
      ctx.fillStyle = "rgba(255, 192, 203, 0.3)"
      ctx.fillRect(0, 0, starX, canvas.height) // 左侧矩形
      ctx.fillRect(endX, 0, canvas.width - endX, canvas.height) // 右侧矩形
      ctx.fillRect(starX, 0, endX - starX, starY) // 顶部矩形
      ctx.fillRect(starX, endY, endX - starX, canvas.height - endY) // 底部矩形

    })
    canvas.addEventListener("mouseup", (e) => {
      isdraging = false
    })
    
    const btn = document.getElementById("btn")
    btn.addEventListener("click", (e) => {
      const aLink = document.createElement("a") // 创建一个a标签可以用来下载
      const cropCanvas = document.createElement("canvas")
      const cropCtx = cropCanvas.getContext("2d")
      const width = endX - starX
      const height = endY - starY
      cropCanvas.width = width
      cropCanvas.height = height
      cropCtx.drawImage(canvas, starX + 1, starY + 1, width - 2, height - 2, 0, 0, width, height)
      const url = cropCanvas.toDataURL()
      // 将canvas放入a标签
      aLink.download = "crop-image.png"
      aLink.href = url
      aLink.appendChild(cropCanvas)
      document.body.appendChild(aLink)


    })

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我来回答你的问题。首先,我们需要将用户上传的图片展示在canvas中,可以使用以下代码: ```javascript // 获取用户上传的图片 const file = document.getElementById('input-file').files[0]; const img = new Image(); // 将图片加载到canvas中 img.onload = function() { const canvas = document.getElementById('canvas'); const ctx = canvas.getContext('2d'); ctx.drawImage(img, 0, 0, canvas.width, canvas.height); }; img.src = URL.createObjectURL(file); ``` 接着,我们需要在canvas实现裁剪功能。可以使用以下代码: ```javascript // 定义裁剪区域 let x = 0; let y = 0; let width = 100; let height = 100; // 绘制裁剪区域 ctx.strokeStyle = '#000'; ctx.strokeRect(x, y, width, height); // 监听鼠标事件,实现拖拽裁剪区域 let isDragging = false; let startX = 0; let startY = 0; canvas.addEventListener('mousedown', e => { isDragging = true; startX = e.offsetX; startY = e.offsetY; }); canvas.addEventListener('mousemove', e => { if (isDragging) { const offsetX = e.offsetX - startX; const offsetY = e.offsetY - startY; x += offsetX; y += offsetY; startX = e.offsetX; startY = e.offsetY; redraw(); } }); canvas.addEventListener('mouseup', e => { isDragging = false; }); // 重绘canvas function redraw() { ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.drawImage(img, 0, 0, canvas.width, canvas.height); ctx.strokeStyle = '#000'; ctx.strokeRect(x, y, width, height); } ``` 最后,我们需要将裁剪后的图片上传到服务器。可以使用以下代码: ```javascript // 获取裁剪后的图片数据 const data = canvas.toDataURL('image/png'); // 将图片数据上传到服务器 axios.post('/upload', { image: data }).then(response => { console.log(response.data); }).catch(error => { console.log(error); }); ``` 以上就是使用原生JS配合canvas实现头像裁剪上传的方法,你可以在Vue3项目中使用这些代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值