如何通过微信小程序canvas绘制实现圆角base64图片的生成?
- 内容介绍
- 文章标签
- 相关推荐
本文共计826个文字,预计阅读时间需要4分钟。
接口返回base64格式的小程序二维码,以往的做法是需要再调一个接口去获取jpg/png格式的图片。如果没有这个接口,是否也可以实现?当然可以。小程序canvas不支持直接使用base64绘制,但可以通过以下步骤实现:
1. 将base64字符串解码为二进制数据。
2.创建一个Blob对象,使用解码后的二进制数据。
3.创建一个URL对象,指向Blob对象。
4.将URL设置为canvas的src属性,从而在canvas上显示二维码。
以下是实现这一功能的示例代码:
javascript
function drawQRCode(base64) { // 解码base64字符串 const byteString=atob(base64.split(',')[1]); const mimeString=base64.split(',')[0].split(':')[1].split(';')[0]; const ab=new ArrayBuffer(byteString.length); const ia=new Uint8Array(ab); for (let i=0; i// 创建canvas元素 const canvas=document.createElement('canvas'); const ctx=canvas.getContext('2d');
// 设置canvas大小 canvas.width=200; // 根据需要调整 canvas.height=200; // 根据需要调整
// 设置图片源 const img=new Image(); img.src=url;
// 图片加载完成后绘制到canvas img.onload=function() { ctx.drawImage(img, 0, 0); // 这里可以添加其他绘制操作,如添加文字等
// 将canvas内容转换为base64字符串 const canvasData=canvas.toDataURL('image/png'); console.log(canvasData); // 输出base64格式的图片
// 清理资源 URL.revokeObjectURL(url); };}
// 假设这是从接口获取的base64字符串const base64QRCode='data:image/png;base64,...';drawQRCode(base64QRCode);
这段代码首先将base64字符串解码为二进制数据,然后创建一个Blob对象,并生成一个指向该Blob的URL。接着,创建一个canvas元素并设置其大小,将解码后的图片设置为canvas的源,并在图片加载完成后将其绘制到canvas上。最后,将canvas的内容转换为base64格式的图片字符串。
接口返回base64格式小程序二维码,以往的做法是需要再调一个接口去拿到jpg/png格式的图片。如果没有这个接口呢,是不是也可以?然而小程序canvas并不支持直接使用base64绘制,好在小程序的文件系统提供了方法,可以把base64经过进一步处理转成本地图片。
获取base64格式图片
getXcxQrcode() { wx.request({ url: app.globalData.globalUrl + "/get_wx_code", data: { token: app.globalData.weixin_token, scene: app.globalData.page_key, page: "pages/index/index" }, success: (res) => { if (data.data.success) { this.base64src(data.data) } } }) }
base64格式图片转换成本地图片
base64src(base64data) { const filePath = `${wx.env.USER_DATA_PATH}/tmpbase64.png`; const buffer = wx.base64ToArrayBuffer(base64data.buffer); let that = this; fsm.writeFile({ filePath, data: buffer, encoding: 'binary', success() { that.setData({ qrcodeUrl: filePath // 得到img.558idc.com/uploadfile/allimg/js/tmpbase64.png }) }, fail() { reject(new Error('ERROR_BASE64SRC_WRITE')); }, }); },
使用获得的本地图片绘制圆角二维码
var qrW = 150; //绘制的二维码宽度 var qrH = 150; //绘制的二维码高度 var qr_x = 540; //绘制的二维码在画布上的位置 var qr_y = 960; //绘制的二维码在画布上的位置 ctx.save(); ctx.beginPath(); //开始绘制 //先画个圆 前两个参数确定了圆心 (x,y) 坐标 第三个参数是圆的半径 四参数是绘图方向 默认是false,即顺时针 ctx.arc(qrW / 2 + qr_x, qrH / 2 + qr_y, qrW / 2, 0, Math.PI * 2, false); ctx.clip(); //画好了圆 剪切 原始画布中剪切任意形状和尺寸。一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内 这也是我们要save上下文的原因 ctx.drawImage(this.data.qrcodeUrl, qr_x, qr_y, qrW, qrH); ctx.draw()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。
本文共计826个文字,预计阅读时间需要4分钟。
接口返回base64格式的小程序二维码,以往的做法是需要再调一个接口去获取jpg/png格式的图片。如果没有这个接口,是否也可以实现?当然可以。小程序canvas不支持直接使用base64绘制,但可以通过以下步骤实现:
1. 将base64字符串解码为二进制数据。
2.创建一个Blob对象,使用解码后的二进制数据。
3.创建一个URL对象,指向Blob对象。
4.将URL设置为canvas的src属性,从而在canvas上显示二维码。
以下是实现这一功能的示例代码:
javascript
function drawQRCode(base64) { // 解码base64字符串 const byteString=atob(base64.split(',')[1]); const mimeString=base64.split(',')[0].split(':')[1].split(';')[0]; const ab=new ArrayBuffer(byteString.length); const ia=new Uint8Array(ab); for (let i=0; i// 创建canvas元素 const canvas=document.createElement('canvas'); const ctx=canvas.getContext('2d');
// 设置canvas大小 canvas.width=200; // 根据需要调整 canvas.height=200; // 根据需要调整
// 设置图片源 const img=new Image(); img.src=url;
// 图片加载完成后绘制到canvas img.onload=function() { ctx.drawImage(img, 0, 0); // 这里可以添加其他绘制操作,如添加文字等
// 将canvas内容转换为base64字符串 const canvasData=canvas.toDataURL('image/png'); console.log(canvasData); // 输出base64格式的图片
// 清理资源 URL.revokeObjectURL(url); };}
// 假设这是从接口获取的base64字符串const base64QRCode='data:image/png;base64,...';drawQRCode(base64QRCode);
这段代码首先将base64字符串解码为二进制数据,然后创建一个Blob对象,并生成一个指向该Blob的URL。接着,创建一个canvas元素并设置其大小,将解码后的图片设置为canvas的源,并在图片加载完成后将其绘制到canvas上。最后,将canvas的内容转换为base64格式的图片字符串。
接口返回base64格式小程序二维码,以往的做法是需要再调一个接口去拿到jpg/png格式的图片。如果没有这个接口呢,是不是也可以?然而小程序canvas并不支持直接使用base64绘制,好在小程序的文件系统提供了方法,可以把base64经过进一步处理转成本地图片。
获取base64格式图片
getXcxQrcode() { wx.request({ url: app.globalData.globalUrl + "/get_wx_code", data: { token: app.globalData.weixin_token, scene: app.globalData.page_key, page: "pages/index/index" }, success: (res) => { if (data.data.success) { this.base64src(data.data) } } }) }
base64格式图片转换成本地图片
base64src(base64data) { const filePath = `${wx.env.USER_DATA_PATH}/tmpbase64.png`; const buffer = wx.base64ToArrayBuffer(base64data.buffer); let that = this; fsm.writeFile({ filePath, data: buffer, encoding: 'binary', success() { that.setData({ qrcodeUrl: filePath // 得到img.558idc.com/uploadfile/allimg/js/tmpbase64.png }) }, fail() { reject(new Error('ERROR_BASE64SRC_WRITE')); }, }); },
使用获得的本地图片绘制圆角二维码
var qrW = 150; //绘制的二维码宽度 var qrH = 150; //绘制的二维码高度 var qr_x = 540; //绘制的二维码在画布上的位置 var qr_y = 960; //绘制的二维码在画布上的位置 ctx.save(); ctx.beginPath(); //开始绘制 //先画个圆 前两个参数确定了圆心 (x,y) 坐标 第三个参数是圆的半径 四参数是绘图方向 默认是false,即顺时针 ctx.arc(qrW / 2 + qr_x, qrH / 2 + qr_y, qrW / 2, 0, Math.PI * 2, false); ctx.clip(); //画好了圆 剪切 原始画布中剪切任意形状和尺寸。一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内 这也是我们要save上下文的原因 ctx.drawImage(this.data.qrcodeUrl, qr_x, qr_y, qrW, qrH); ctx.draw()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易盾网络。

