canvas画布操作加载图片,另存为,绘制,旋转,拖动,放大,还原

  • 加载base64图片
const img = ref(null)
img.value = new Image()
img.value.src = base64
img.value.onload = () => {
	if (img.value.complete) {
	...加载成功
	}
}
  • 绘制到画布
const mycanvas = ref(null)
const drawImage = () => {
      const canvas = mycanvas.value
      const ctx = canvas.getContext('2d')
      ctx.clearRect(0,0,canvas.width,canvas.height)
      ctx.save()
      ctx.translate(originPoint.x, originPoint.y) //平移位置
      ctx.rotate(radian.value) //旋转角度
      ctx.drawImage(img.value, -imageSize.width / 2, -imageSize.height / 2)
      ctx.restore()
    }
  • 旋转画布
const radian = ref(0)
doRotate(angle) => {
	radian.value = angle
	drawImage()
}
doRotate(-(Math.PI / 180)) // 左转一次
doRotate(Math.PI / 180) // 右转一次
doRotate(0) // 还原画布

const startRotation = (direction) => {
   intervalId = setInterval(() => {
     doRotate(direction)
   },100)
 }
 startRotation(-(Math.PI / 180)) // 连续左转
  • 拖动画布
    改变画布的原点
    pc端事件mousedown or 移动端事件touchstart
<canvas id="mycanvas" ref="mycanvas" width="0" height="0" style="border:1px solid #d3d3d3;"
      v-on:mousedown="onMouseDown" v-on:mouseup="onMouseUp" v-on:mousemove="onMouseMove"
       v-on:touchstart="onTouchStart" v-on:touchend="onTouchEnd" v-on:touchmove="onTouchMove"></canvas>
	var originPoint = {x:0,y:0} //记录原点
	let startX
    let startY

    //event...
    const onMouseDown = (e) => {
      startX = e.clientX
      startY = e.clientY
      isMoveing = true
    }
    const onMouseMove = (e) => {
      onMove(e.clientX, e.clientY)
    }
    const onMouseUp = () => {
      isMoveing = false
      mycanvas.value.style.cursor="auto"
    }
    const onTouchStart = (e) => {
      startX = e.touches[0].clientX
      startY = e.touches[0].clientY
      isMoveing = true
    }
    const onTouchMove = throttle((e) => {
      onMove(e.touches[0].clientX, e.touches[0].clientY)
    }, 0)
    const onTouchEnd = () => {
      isMoveing = false
      mycanvas.value.style.cursor="auto"
    }
    const onMove = (x, y) => {
      if (!isMoveing) {
        return
      }
      var dx = x - startX
      var dy = y - startY    
      originPoint.x += dx
      originPoint.y += dy
      drawImage()
      startX = x
      startY = y
    }
  • 保存canvas画布内容为file
const canvas = mycanvas.value
var dataURL = canvas.toDataURL()
var file = dataURLtoFile(dataURL)
//转为file
function dataURLtoFile(dataurl) {
  let arr = dataurl.split(',')
  let mime = arr[0].match(/:(.*?);/)[1]
  let bstr = atob(arr[1])
  let n = bstr.length
  let u8arr = new Uint8Array(n)
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n)
  }
  return new File([u8arr], 'image.png', { type: mime })
}
  • 放大画布

const onScale = (rate) => {
  scale.value = scale.value + rate
  drawImage()
}
onScale(0.15)
  • 还原画布
const onRecover = () => {
      scale.value = 1
      radian.value = 0
      originPoint = {x: imageSize.width / 2,y: imageSize.height / 2}
      drawImage()
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值