当前位置: 首页 > news >正文

微信小程序原生如何使用画布生成名片

步骤 1:在页面中添加画布组件

首先在 .wxml 中定义画布,注意设置固定宽高(生成图片时尺寸更可控),并添加一个生成按钮:

<!-- pages/card/card.wxml -->
<view class="container"><!-- 画布:用于绘制名片 --><canvas type="2d" canvas-id="cardCanvas" width="600" height="400" class="canvas"></canvas><!-- 生成图片按钮 --><button bindtap="generateCard" class="generate-btn">生成名片图片</button><!-- 预览生成的图片 --><image src="{{cardImage}}" mode="widthFix" class="preview-img" wx:if="{{cardImage}}"></image>
</view>

步骤 2:样式设置(可选)

在 .wxss 中设置画布和按钮的样式,确保画布显示正常:

/* pages/card/card.wxss */
.container {display: flex;flex-direction: column;align-items: center;padding: 20rpx;
}.canvas {border: 1px solid #eee;width: 600rpx; /* 小程序中rpx适配,600rpx约等于300px */height: 400rpx;
}.generate-btn {margin-top: 30rpx;background: #07c160;color: white;
}.preview-img {margin-top: 30rpx;width: 600rpx;border: 1px solid #eee;
}

步骤 3:使用 Canvas 2D API 绘制名片

在 .js 中获取画布上下文,通过 API 绘制名片元素(背景、头像、文字、二维码等):

// pages/card/card.js
Page({data: {cardImage: '', // 生成的名片图片路径},onLoad() {// 页面加载时先绘制名片this.drawCard();},// 绘制名片drawCard() {// 获取画布上下文(2D模式)const query = wx.createSelectorQuery()query.select('#cardCanvas').fields({ node: true, size: true }).exec((res) => {const canvas = res[0].nodeconst ctx = canvas.getContext('2d')// 设置画布实际尺寸(与wxml中width/height一致)const dpr = wx.getSystemInfoSync().pixelRatio // 设备像素比,避免模糊canvas.width = res[0].width * dprcanvas.height = res[0].height * dprctx.scale(dpr, dpr) // 缩放上下文,解决高清屏模糊问题// 1. 绘制名片背景(渐变效果)const gradient = ctx.createLinearGradient(0, 0, 600, 0)gradient.addColorStop(0, '#f5f5f5')gradient.addColorStop(1, '#e8f5e9')ctx.fillStyle = gradientctx.fillRect(0, 0, 600, 400) // 绘制矩形背景// 2. 绘制头像(先加载图片再绘制)const avatarImg = canvas.createImage()avatarImg.src = '/images/avatar.jpg' // 本地头像路径(需提前放置)avatarImg.onload = () => {// 绘制圆形头像(先画圆再裁剪)ctx.save()ctx.beginPath()ctx.arc(100, 100, 60, 0, 2 * Math.PI) // 圆心(100,100),半径60ctx.clip() // 裁剪为圆形ctx.drawImage(avatarImg, 40, 40, 120, 120) // 绘制图片(填满圆形区域)ctx.restore() // 恢复上下文状态// 3. 绘制姓名ctx.font = 'bold 36px sans-serif'ctx.fillStyle = '#333'ctx.fillText('张三', 220, 100)// 4. 绘制职位ctx.font = '24px sans-serif'ctx.fillStyle = '#666'ctx.fillText('产品经理', 220, 140)// 5. 绘制联系方式(电话/微信)ctx.font = '20px sans-serif'ctx.fillStyle = '#666'ctx.fillText('电话:13800138000', 220, 180)ctx.fillText('微信:zhangsan123', 220, 220)// 6. 绘制公司logo(可选)const logoImg = canvas.createImage()logoImg.src = '/images/logo.png' // 本地logo路径logoImg.onload = () => {ctx.drawImage(logoImg, 450, 60, 80, 80) // 绘制到右上角}// 7. 绘制二维码(可选,需提前准备二维码图片)const qrImg = canvas.createImage()qrImg.src = '/images/qrcode.jpg' // 本地二维码路径qrImg.onload = () => {ctx.drawImage(qrImg, 450, 220, 100, 100) // 绘制到右下角}// 8. 绘制底部线条ctx.strokeStyle = '#ddd'ctx.lineWidth = 2ctx.beginPath()ctx.moveTo(50, 350)ctx.lineTo(550, 350)ctx.stroke()// 9. 绘制公司名称ctx.font = '22px sans-serif'ctx.fillStyle = '#999'ctx.fillText('XX科技有限公司 © 2023', 180, 380)}})},// 生成名片图片(保存到本地或展示)generateCard() {wx.canvasToTempFilePath({canvasId: 'cardCanvas',success: (res) => {this.setData({cardImage: res.tempFilePath // 展示生成的图片})// 可选:保存到相册wx.saveImageToPhotosAlbum({filePath: res.tempFilePath,success: () => wx.showToast({ title: '保存成功' }),fail: (err) => console.error('保存失败', err)})},fail: (err) => console.error('生成图片失败', err)})}
})

关键说明:

  1. 画布尺寸与模糊问题:通过 pixelRatio 缩放画布,解决高清屏幕下绘制内容模糊的问题(核心是 canvas.width = 实际宽 * dpr 并 ctx.scale(dpr, dpr))。

  2. 图片加载:绘制网络图片或本地图片时,必须在 onload 回调中执行绘制(确保图片加载完成),否则会绘制失败。

  3. 元素绘制顺序:先绘制底层元素(如背景),再绘制上层元素(如文字、头像),避免被覆盖。

  4. 生成图片:使用 wx.canvasToTempFilePath 将画布内容转为临时图片路径,可用于展示或保存到相册(需用户授权)。

http://www.dtcms.com/a/528224.html

相关文章:

  • Postman介绍和安装,发送带参数的GET请求
  • 海西州wap网站建设公司网站布局怎么用dw做
  • Python入门经典题目
  • 佛山网站建设乐云seo在线制作wordpress媒体库略缩图
  • 网站的服务器怎么做的网站模板软件
  • Go Web 编程快速入门 07.4 - 模板(4):组合模板与逻辑控制
  • 【Canvas与旗帜】标准加拿大枫叶旗
  • LwIP协议栈MPA多进程架构
  • 【JUnit实战3_12】第七章:用 Stub 模拟进行粗粒度测试
  • 东莞网络推广网站做静态网站软件
  • 想建网站做优化网站建设服务费 印花税
  • verilog阻塞赋值和非阻塞赋值的区别
  • 【Redis典型应用——缓存详解】
  • 阮一峰《TypeScript 教程》学习笔记——模块
  • 第 09 天:文件传输 (SCP, SFTP, rsync, FTP, NFS)
  • pandas 和 numpy相关函数详解
  • 酵母 cDNA 文库:解码基因表达与功能研究的核心工具
  • Win10使用WSL2安装ubuntu22.04
  • macos 下 docker使用方法 新手教程
  • t恤定制网站哪个网站是做红酒酒的
  • 玉林网站建设培训wordpress美术馆插件
  • 一个大型 3A 游戏的开发流程是怎么样的?
  • 智能性能分析:AI大模型识别性能瓶颈并提出改进建议
  • Flutter 中使用 Flame + flame_forge2d 的注意事项清单
  • SpringBoot教程(安装篇):Elasticsearch及可视化工具安装(Windows环境)
  • 华为OD机试双机位A卷 - 商品推荐多属性排序 (C++ Python JAVA JS GO)
  • 延安市违法建设举报网站深圳宝安网站推广
  • Mac Nginx安装、启动、简单命令(苍穹外卖、黑马点评前端环境搭建)
  • 新乡哪有做网站的北京seo执行
  • GitHub等平台形成的开源文化正在重塑林语堂