教你用Canvas将图片截成圆图

超能的Canvas又来啦
不知道大家会不会碰到要把一张方方正正的图截取成Cute的圆图呢
今天来告诉你,怎么化茧成蝶


实现

加载一张可访问的图片,使用Canvas绘制一个圆形画布,将图片在画布范围内进行展示,最后通过Canvas把绘制完成的图转换成可访问的base64编码路径

应用

图片加载需要时间,绘制的过程要在图片加载完成之后,所有我们采用 async await 来保证绘制过程的顺利进行,最终获取我们想要的圆图URL

<img :src="src" alt="">
this.$nextTick( async () => {
	let picUrl = `${可通过浏览器访问的图片URL}`;
   	this.src = await this.imageToCircle(picUrl)
})      
方法:
imageToCircle (picUrl) {
    let radius, diameter, canvas, ctx;
    let img = new Image()
    img.setAttribute('crossOrigin','anonymous'); // 解决图片跨域访问失败
    img.src = picUrl

    return new Promise((reslove) => {
        img.addEventListener("load", () => {
            let { width, height } = img
            if (img.width > img.height) {
                radius = height / 2;
            } else {
                radius = width / 2;
            }
            diameter = radius * 2;
            canvas = document.createElement('canvas');
            if (!canvas.getContext) { // 判断浏览器是否支持canvas,如果不支持在此处做相应的提示
                console.log('您的浏览器版本过低,暂不支持。');
                return false;
            }
            canvas.width = diameter;
            canvas.height = diameter;
    
            ctx = canvas.getContext("2d");
            ctx.clearRect(0, 0, diameter, diameter);

            // 描边
            ctx.save();         //save和restore可以保证样式属性只运用于该段canvas元素
            ctx.strokeStyle = 'red';       //设置边线的颜色
            ctx.lineWidth = 2;
            ctx.beginPath();    //开始路径
            ctx.arc(radius, radius, radius - 5, 0, Math.PI * 2);      //画一个整圆.
            ctx.stroke();       //绘制边线

            // 截圆形图
            ctx.save();
            ctx.beginPath();
            ctx.arc(radius, radius, radius - 5, 0, Math.PI * 2);
            ctx.clip();

            let x = 0, y = 0, swidth = diameter, sheight = diameter

            ctx.drawImage(img, x, y, swidth, sheight, 0, 0, diameter, diameter);
            ctx.restore();
            // toDataURL()是canvas对象的一种方法,用于将canvas对象转换为base64位编码
            let dataURL = canvas.toDataURL('image/png'); 
            reslove(dataURL)

        }, false)
        
    })
}

这样就完成啦 赶紧试试吧

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值