教你用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
    评论
你可以使用微信小程序的 Canvas 组件和相关 API 来实现图片裁剪形的效果。以下是一个简单的示例代码: 1. 在你的小程序页面的 JSON 文件中添加 Canvas 组件: ```json { "usingComponents": { "canvas": "/path/to/canvas" } } ``` 2. 在你的小程序页面的 WXML 文件中添加 Canvas 组件的标签: ```html <canvas canvas-id="myCanvas" style="width: 200px; height: 200px;"></canvas> ``` 3. 在你的小程序页面的 JS 文件中编写相关代码: ```javascript Page({ onReady: function () { const ctx = wx.createCanvasContext('myCanvas') wx.getImageInfo({ src: '/path/to/image.jpg', success: function (res) { const imgWidth = res.width const imgHeight = res.height const radius = imgWidth > imgHeight ? imgHeight / 2 : imgWidth / 2 ctx.save() ctx.beginPath() ctx.arc(radius, radius, radius, 0, 2 * Math.PI) ctx.clip() ctx.drawImage(res.path, 0, 0, imgWidth, imgHeight, 0, 0, radius * 2, radius * 2) ctx.restore() ctx.draw() } }) } }) ``` 上述代码中,通过 `wx.getImageInfo` 方法获取图片信息,然后根据图片大小确定裁剪半径。接下来,在 Canvas 上绘制一个形路径并使用 `ctx.clip()` 方法进行裁剪。最后,使用 `ctx.drawImage` 方法将图片绘制在裁剪后的区域内。最后调用 `ctx.draw()` 方法进行渲染。 请注意替换示例代码中的图片路径和 Canvas 组件的样式为你实际使用的路径和样式。 希望对你有所帮助!如有任何问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值