canvas裁剪图片

原文地址:https://segmentfault.com/a/1190000019411974?utm_source=tag-newest 

<template>
  <div class="rc-cropper-canvas">
    <el-col :span="12">
      <canvas id="canvas"></canvas>
      <el-button type="danger" size="small" @click="cropImg()" class="rc-crop__iconCropCanvas">裁剪</el-button>
    </el-col>
    <el-col :span="12">
      <canvas id="canvasafter"></canvas>
    </el-col>
  </div>
</template>
<script>
export default {
  name: 'cropper-canvas',
  props: {
    data: {
      type: Object,
      required: true,
      default: () => {}
    }
  },
  mounted () {
    this.drawImg()
  },
  methods: {
    drawImg () {
      this.$nextTick(() => {
        let canvas = document.getElementById('canvas')
        if (canvas) {
          canvas.width = 345
          canvas.height = 98
          let ctx = canvas.getContext('2d')
          ctx.clearRect(0, 0, canvas.width, canvas.height)
          let img = new Image()
          img.crossOrigin = 'Anonymous'
          img.src = this.data.imageUrl
          img.onload = function () {
            ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
          }
        }
      })
    },
    cropImg () {
      let canvas = document.getElementById('canvas')
      let ctx = canvas.getContext('2d')
      canvas.width = 345
          canvas.height = 98
      let img = new Image()
      img.crossOrigin = 'Anonymous'
      img.src = this.data.imageUrl
      img.onload = function () {
        ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
      }
      // img.src = this.data.src
      let drag = false // 是否拖动矩形
      let flag = false // 是否绘制矩形
      let rectWidth = 0 // 绘制矩形的宽
      let rectHeight = 0 // 绘制矩形的高
      let clickX = 0 // 矩形开始绘制X坐标
      let clickY = 0 // 矩形开始绘制Y坐标
      let dragX = 0 // 当要拖动矩形点击时X坐标
      let dragY = 0 // 当要拖动矩形点击时Y坐标
      let newRectX = 0 // 拖动变化后矩形开始绘制的X坐标
      let newRectY = 0 // 拖动变化后矩形开始绘制的Y坐标
      // 鼠标按下
      canvas.onmousedown = e => {
        ctx.beginPath()
        ctx.setLineDash([6, 6])
        ctx.moveTo(newRectX, newRectY)
        ctx.lineTo(newRectX + rectWidth, newRectY)
        ctx.lineTo(newRectX + rectWidth, newRectY + rectHeight)
        ctx.lineTo(newRectX, newRectY + rectHeight)
        ctx.lineTo(newRectX, newRectY)
        ctx.strokeStyle = 'green'
        ctx.stroke()
        if (ctx.isPointInPath(e.offsetX, e.offsetY)) {
          drag = true
          dragX = e.offsetX
          dragY = e.offsetY
          clickX = newRectX
          clickY = newRectY
        } else {
          ctx.clearRect(0, 0, canvas.width, canvas.height)
          ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
          flag = true
          clickX = e.offsetX
          clickY = e.offsetY
          newRectX = e.offsetX
          newRectY = e.offsetY
        }
      }
      // 鼠标抬起
      canvas.onmouseup = () => {
        if (flag) {
          flag = false
          this.sureCrop(clickX, clickY, rectWidth, rectHeight)
        }
        if (drag) {
          drag = false
          this.sureCrop(newRectX, newRectY, rectWidth, rectHeight)
        }
      }
      // 鼠标移动
      canvas.onmousemove = (e) => {
        if (flag) {
          ctx.clearRect(0, 0, canvas.width, canvas.height)
          ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
          rectWidth = e.offsetX - clickX
          rectHeight = e.offsetY - clickY
          ctx.beginPath()
          ctx.strokeStyle = '#FF0000'
          ctx.strokeRect(clickX, clickY, rectWidth, rectHeight)
          ctx.closePath()
        }
        if (drag) {
          ctx.clearRect(0, 0, canvas.width, canvas.height)
          ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
          ctx.beginPath()
          newRectX = clickX + e.offsetX - dragX
          newRectY = clickY + e.offsetY - dragY
          ctx.strokeStyle = 'yellow'
          ctx.strokeRect(newRectX, newRectY, rectWidth, rectHeight)
          ctx.closePath()
        }
      }
    },
    sureCrop (x, y, width, height) {
      let canvas = document.getElementById('canvasafter')
      // 设置canvas的宽为canvas的父元素宽度,宽高比3:2
      let parentEle = canvas.parentElement
      canvas.width = 345
      canvas.height = 98
      let ctx = canvas.getContext('2d')
      let img = new Image()
      img.src = this.data.imageUrl
      img.onload = function () {
        ctx.beginPath()
        ctx.moveTo(x, y)
        ctx.lineTo(x + width, y)
        ctx.lineTo(x + width, y + height)
        ctx.lineTo(x, y + height)
        ctx.clip()
        ctx.drawImage(img, 0, 0, canvas.width, canvas.height)
      }
      ctx.stroke()
    }
  }
}
</script>
<style>
.rc-cropper-canvas {
  position: relative;
}
img {
  width: 100%;
  height: 100%;
}
.rc-crop__iconCropCanvas {
  position: absolute;
  left: 44%;
  top: 4%;
}
.el-button {
  margin: 20px 0;
  display: block;
  z-index: 10000;
}
</style>

如有侵权,请告知删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值