微信小程序 Canvas 2D 绘图实战:从圆、虚线到图片绘制

VS2022下OSG+OSGEARTH开发环境一键配置指南(Win10 x64+CMake自动化构建) 本文详细介绍了在VS2022环境下配置OSG和OSGEARTH开发环境的完整指南,包括软件下载、CMake自动化构建、编译实战及环境验证。通过一键配置脚本和常见问题解决方案,帮助开发者快速搭建3D开发环境,提升开发效率。 阅读详情

小程序里画图只有三步:拿到 Canvas 节点 → 拿 2d 上下文 → 按 dpr 缩放后正常调 API。 真正容易翻车的不是绘图 API,而是四个细节:节点获取方式、设备像素比、绘图状态残留、图片的异步加载。 把这几处处理好,案例里剩下的 9 个按钮本质上只是调用不同的 CanvasRenderingContext2D 方法。


一、界面与效果

页面结构很简单:顶部红色标题、一块浅灰画布(100% × 680rpx,背景 #e9ecf3)、下方 4 行绿色按钮。标题会跟随当前操作变化,比如点「绘制图片」后变成「绘图图片」。

画布用新版的 type="2d",不是老的 canvas-id 写法:


<canvas type="2d" id="my-canvas"></canvas>

这一个小改动决定了后面整条技术路线:新版 Canvas 必须拿到真实的 Canvas 节点实例,wx.createCanvasContext 那套已经不能用了。


二、初始化:节点、上下文和 dpr


onReady() {

wx.createSelectorQuery()

.select('#my-canvas')

.fields({ node: true, size: true })

.exec(res => {

const canvas = res[0].node

const ctx = canvas.getContext('2d')

const dpr = wx.getWindowInfo().pixelRatio

canvas.width = res[0].width * dpr // 物理像素

canvas.height = res[0].height * dpr

ctx.scale(dpr, dpr) // 之后按 CSS 像素绘图

this.canvas = canvas

this.ctx = ctx

this.cw = res[0].width // CSS 宽

this.ch = res[0].height // CSS 高

})

}

关键在于 canvas.width/height 单位是物理像素,而 fields 返回的 size 是逻辑(CSS)像素。 先按 dpr 放大画布尺寸,再 scale(dpr, dpr),后续代码就可以完全按设计稿的坐标写,真机上也不会糊。

如果屏幕是 3 倍屏,画布物理宽是逻辑宽的 3 倍;忘了 scale 的话,图形会挤在左上角一小块。


三、九个绘图按钮,其实就几行代码

每个按钮的处理函数都是同一个套路:清空 → save → 画 → restore → 改标题。

  • 清空画布:beginPath() + clearRect()
  • 实心圆:arc() + fillStyle + fill()
  • 轮廓圆:strokeStyle + lineWidth + arc() + stroke()
  • 虚线:setLineDash([5, 15])
  • 端点交点:lineCap='round' + lineJoin='miter'
  • 文字:font + textBaseline + fillText() + rotate()
  • 径向渐变:createRadialGradient() + addColorStop()
  • 阴影矩形:shadowOffsetX/Y + shadowBlur + shadowColor
  • 半透明图:globalAlpha

几个值得记住的参数:

  • setLineDash([5, 15]) 是「实线 5px、空白 15px」交替循环,不是总长度。
  • createRadialGradient(x0, y0, r0, x1, y1, r1) 是两个圆:内圆是渐变起点,外圆是渐变终点,半径差决定渐变色的过渡范围。
  • textBaseline 决定 fillText(x, y) 里的 y 指文字顶部、底部还是基线,画多行文字时不设它很容易叠在一起。
  • shadowBlur 不是像素值,数值越大越模糊,且不受当前变换矩阵影响。

统一的清空函数:


_clear() {

const ctx = this.ctx

if (!ctx) return

ctx.beginPath()

ctx.clearRect(0, 0, this.cw, this.ch) // 注意:用 CSS 宽高

}


四、作业扩展:把图片画到画布上

需求:新增「绘制图片」按钮,点击后画布显示图片,标题跟着变。


drawImage() {

this._clear()

this.setTitle('绘图图片')

const img = this.canvas.createImage() // 用 Canvas 实例创建,不是 wx.createImage()

img.onload = () => {

ctx.save()

// 等比铺满画布并居中,避免直接拉伸变形

const scale = Math.max(this.cw / img.width, this.ch / img.height)

const dw = img.width * scale

const dh = img.height * scale

ctx.drawImage(img, (this.cw - dw) / 2, (this.ch - dh) / 2, dw, dh)

ctx.restore()

}

img.onerror = () => wx.showToast({ title: '图片加载失败', icon: 'none' })

img.src = '/images/landscape.jpg' // 本地包路径,相对项目根目录

}

三个要点:

  1. createImage() 挂在 canvas 实例上,页面里没有 wx.createImage 这个等价写法。
  1. 先挂 onload,最后设 src。src 一赋值就开始异步加载,加载完成前 drawImage 什么都不会画。
  1. drawImage(image, dx, dy, dWidth, dHeight) 的五参数版本里,dx/dy 是左上角坐标,dWidth/dHeight 是绘制后的尺寸。想做「裁切填充」就用 Math.max 算缩放比,想「完整显示」就用 Math.min。

图片放在 images/ 目录、用 /images/xxx.jpg 这种包内路径,不需要在后台配置域名;换成网络图片才需要 downloadFile 合法域名。


五、四个真实踩过的坑

1. 状态会残留。 fillStyle、lineWidth、shadowBlur、globalAlpha、rotate 都是上下文状态,画完阴影矩形再画圆,圆会带上阴影。所以每个绘图函数都 save() 开头、restore() 结尾,clearRect 之前再 beginPath() 清掉旧路径。

2. clearRect 用错单位。 复制老代码时容易写成 clearRect(0, 0, canvas.width, canvas.height),但 canvas.width 是物理像素,又已经 scale(dpr) 过,等于多清了一大片——本身不报错,但概念是错的,后面做导出、截图就会对不上。

3. 忘了 await 图片。 图片没加载完就 drawImage,真机上就是一块空白,而且不报错,很迷惑。

4. scroll-view 里的画布。 页面用了 scroll-view 承载内容,画布节点一定要在页面 onReady 之后再查,太早查 res[0] 是 undefined。


六、小结

这套代码的价值不在「画了一个圆」,而在于把 Canvas 2D 的通用流程走顺了:

  • 节点 → 上下文 → dpr 缩放,是后面所有绘图、图表、海报合成的起点;
  • save/restore 成对使用,是多人协作时最容易被删掉的「无用代码」,也是最不该删的;
  • drawImage 的尺寸计算,是所有「生成分享海报」需求的必修课。
4.2 多智能体系统的严格隔离机制:防止上下文污染与隐私数据脱敏实战 本文探讨了多智能体系统中上下文信息共享带来的安全风险与解决方案。研究发现,随着Agent数量增加,上下文信息泄露概率呈指数级上升,可能导致跨Agent错误传播、隐私泄露等问题。文章提出分层隔离架构,将上下文划分为全局共享和本地私有两部分,并通过命名空间隔离、递归压缩和隐私过滤技术确保数据安全。技术实现上,建议为每个子Agent创建独立状态空间,采用原子化更新和读写锁控制避免状态竞争。隐私保护方面,结合正则匹配和命名实体识别技术进行敏感数据过滤,确保符合GDPR等法规要求。这些措施共同构建了可靠、安全且合规的 阅读详情

相关推荐

GWAS与eQTL相结合,进一步筛选疾病相关基因

欢迎关注”生信修炼手册”!在GWAS分析结果中,大部分显著的SNP位点都位于非编码区,很难直接挖掘这些位点的调控机制。通常假设与疾病关联的SNP位点通过调控基因表达来发挥作用,而eQTL...

庐州月光的博客 1万+

微信小程序 Canvas 基本绘图详解:圆、虚线、文字、渐变、阴影与图片绘制

这个案例把 Canvas 最常用的绘图能力和样式能力集中演示了一遍:圆靠圆弧加填充或描边实现,虚线靠虚线模式,线条末端和转角靠端点与交点样式,文字靠字体、基线和填充文字,渐变靠径向渐变对象加多个色标,阴影靠四个阴影属性,透明度靠全局透明度,图片靠异步加载后再绘制。页面准备完成后,先创建选择器查询对象,选中画布节点,同时请求节点实例和尺寸信息,查询执行完成后从结果中取出画布对象和宽高,再通过画布对象取得 2D 绘图上下文,后续所有绘制都依赖这个上下文。设置填充颜色后调用填充方法,圆弧围成的区域就被填成实心。

2602_96912473的博客 286

不用编码器也能玩转BLDC?手把手教你反电动势定位实战

本文详细介绍了无刷直流电机(BLDC)的无传感器控制方案——反电动势定位法,通过STM32实战演示如何实现基本控制。文章涵盖核心原理、硬件准备、信号采集技巧及代码实现,特别适合静音风扇、小型机器人等对成本敏感的应用场景,帮助开发者降低硬件成本并提升系统可靠性。

lg888的博客 898

微信小程序使用canvas绘图,圆形头像,网络背景图,文字,虚线,直线

base64,'+res//base64的二维码。ctx.fillText('元的直播课程',460,2276)ctx.fillText('超值体验',63.6,2108)ctx.fillText('体验价值',63.6,2276)srcself.data.posterBg,//网络图片。srcposterimg,//网络图片.海报图片。//console.log('绘制头像')//console.log('绘制完毕,转换成图片')srcavatar,//网络图片。...

肖肖肖丽珠的博客 2892

INCA文件刷写全流程:从ES581驱动安装到XCP协议实战(附避坑指南)

本文详细解析INCA文件刷写的全流程操作,从ES581驱动安装到XCP协议配置,提供实战经验与避坑指南。涵盖A2L文件校验、工作区优化、XCP参数调优及自动化刷写技巧,帮助工程师高效完成ECU开发中的文件刷写任务。

egg99的博客 943

IEEE论文接收后,收到Proof邮件别慌!手把手教你48小时内搞定校样(附详细截图)

本文详细解析了IEEE论文接收后Proof校样的全流程,从邮件关键信息解码到精准修改标注,提供48小时内高效完成校样的实战指南。涵盖登录技巧、文件验证、修改标注黄金法则及九宫格检查清单,帮助作者避免常见错误,确保论文顺利发表。

weixin_30652491的博客 563

微信小程序案例5.2:基本绘图——Canvas 2D 九种绘制方式详解

本案例演示微信小程序 Canvas 2D 的基本绘图方法,一个页面集成了九种绘制效果:实心圆、轮廓圆、虚线、端点交点、文字、径向渐变、阴影矩形、半透明图形,以及清空画布。功能扩展:新增一个"绘制图片"按钮,点击后在画布上显示图片,标题随之改变。点击不同按钮,画布上绘制对应的图形,页面标题同步显示当前绘制的图形名称;点击"清空画布",画布恢复空白;点击"绘制图片",画布上显示一张图片,标题变为"绘制图片"。

2402_87499293的博客 224

Win11 24H2家庭版共享打印机失败?别慌,一个批处理脚本搞定所有设置

本文提供了Win11 24H2家庭版共享打印机失败的解决方案,通过一个批处理脚本自动修复所有设置问题。脚本包含安装组策略组件、修改关键注册表项等操作,帮助用户快速恢复打印机共享功能,适用于普通家庭用户。

weixin_30632089的博客 420

微信小程序 Canvas 基本绘图实战:从实心圆到渐变阴影

Canvas 是微信小程序中实现自定义图形绘制的重要能力。本文以「案例 5.2 基本绘图」为例,完整演示如何利用 Canvas 2D API 在小程序中绘制实心圆、轮廓圆、虚线、文字、端点与交点样式、半透明图形、圆形渐变以及阴影矩形,并给出可直接运行的代码与扩展练习思路。

2603_96878926的博客 199

<PLC><西门子><工控>西门子博图V18中使用SCL语言编写一个CRC16-modbus校验程序

西门子官方对于SCL语言的介绍如下:SCL 编程语言SCL 编程语言SCL(Structured Control Language,结构化控制语言)是一种基于 PASCAL 的高级编程语言。这种语言基于标准DIN EN 61131-3(国际标准为 IEC 1131-3)。根据该标准,可对用于可编程逻辑控制器的编程语言进行标准化。SCL 编程语言实现了该标准中定义的 ST 语言 (结构化文本) 的PLCopen 初级水平。语言元素。

用沸腾的热血,支付我们的人生吧! 1437

《QGIS空间数据处理与高级制图》【目录】

《QGIS空间数据处理与高级制图》是一本面向GIS技术人员和学生的进阶手册,重点提升数据处理效率和专业制图标准化水平。全书涵盖空间数据预处理、矢量编辑、栅格处理、坐标系统应用和符号化设计等核心内容。书中详细介绍了批量数据转换、拓扑检查、遥感影像处理、自定义坐标系创建等实用技能,并提供了模型构建器和PyQGIS脚本实现自动化操作。通过大量实战案例和问题排查指南,帮助读者从基础使用进阶到专业应用,适合测绘、规划、环保等行业的GIS从业者参考使用。

LuckyHanMo的博客 374

微信小程序 Canvas 2D 基本绘图实战:从实心圆到图片绘制(案例 5.2)

案例用一个小程序页面把 Canvas 2D 最常用的一批绘图 API 集中演示了一遍:圆、轮廓、虚线、文字、端点与交点、径向渐变、阴影、透明度,最后再加上作业要求的「绘制图片」。createRadialGradient(x0, y0, r0, x1, y1, r1) 用两个圆定义渐变:前三个参数是起始圆,后三个是结束圆。arc(x, y, radius, startAngle, endAngle) 以 (x, y) 为圆心、radius 为半径画圆弧,角度用弧度,整圆就是 0 → 2π。

jslyymhmh的博客 201

汽车行业OTD业务模式入门学习

本文是在学习彭俊松老师的《汽车行业整车订单交付系统》后,对于OTD理解的一些摘录,供诸位参考学习。

qq_40664711的博客 1万+

微信小程序使用canvas绘图,并保存下载到本地。圆形头像,虚线网络图片

小程序canvas 2d绘图

肖肖肖丽珠的博客 1187

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

微信小程序 Skyline Canvas2D 基本绘图案例(实心圆 / 虚线 / 渐变 / 阴影,扩展绘制图片功能)

本文为微信小程序课程作业,基于Skyline渲染模式实现Canvas2D基础绘图功能,包括实心圆、轮廓圆、虚线、渐变、阴影、半透明图形及旋转文字。扩展实现本地图片绘制,通过按钮控制画布渲染,界面简洁直观,无需云服务与模板,完整演示了Canvas2D在小程序中的高效应用。

2401_87969726的博客 167

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

微信小程序实战:Canvas2D 基本绘图案例

Canvas 是小程序中实现绘图、海报生成、图片编辑的核心能力。本案例从最基础的圆形、线条、文字出发,逐步学习渐变、阴影、透明度这类高级视觉效果,同时掌握画布绘制图片的能力。通过练习可以理解画布的坐标系、路径、状态保存恢复、图片异步加载这些重要概念,同时学会处理开发中常见的画布获取失败、绘图模糊、复制代码带来的特殊字符等实际开发问题。

zjkzsk的博客 150

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

微信小程序 Canvas2D|案例 5.2 基本绘图完整实践(附扩展绘制图片功能)

本项目基于微信小程序Canvas2D API,实现基础图形绘制功能,包括实心圆、轮廓圆、虚线、端点交点折线、文字、径向渐变、阴影矩形及半透明图形。通过wx.createSelectorQuery获取画布节点,结合getContext('2d')操作绘图上下文,运用arc、fill、stroke等方法完成图形绘制,并实现图片异步加载与渲染。关键点包括处理设备像素比(dpr)避免模糊、在onload回调中调用drawImage确保图片正常显示。项目完整实现课程要求并扩展“绘制图片”功能,标题同步更新,具备良好交

ANGEL9970的博客 162

微信小程序开发:canvas 2D 基本绘图与绘制图片扩展(案例5.2)

本案例完整演示了微信小程序 Canvas 2D 的初始化流程与常用绘图 API:通过 SelectorQuery 获取画布节点、按 dpr 设置物理像素并缩放坐标系,随后用 arc、fill、stroke、setLineDash、fillText、createRadialGradient、shadow*、globalAlpha 等接口完成实心圆、轮廓圆、虚线、文字、渐变、阴影、半透明等图形绘制。

L22188的博客 170

微信小程序实战:基本绘图与图片绘制

本次实验基于微信小程序Canvas2D完成基础绘图案例,掌握了画布初始化与高分屏适配,熟练使用arc、line、fillText等API绘制圆、线段、文字,学会设置描边、填充、虚线、渐变、阴影、全局透明度等绘图样式。扩展功能实现了本地图片异步加载并绘制到画布,理解canvas.createImage图片加载异步特性。实验中遇到画布上下文异步、图片路径、画布状态污染等问题,学会使用隔离绘图状态,增加防御性判断,提升代码健壮性,熟悉Canvas2D整套开发流程。

2401_87969178的博客 212

微信小程序 Canvas2D 基本绘图实战:基础图形绘制 + 扩展绘制图片功能

Canvas 画布是微信小程序中实现自定义绘图的核心组件,广泛应用于电子签名、海报生成、图表绘制等场景。本次案例为小程序 Canvas 2D 基础绘图实验,目标是掌握画布 API,实现实心圆、轮廓图形、虚线、文字绘制,同时演示端点样式、交点样式、渐变填充、阴影、透明度等绘图效果。在此基础上完成功能扩展,新增【绘制图片】按钮,点击后在画布渲染图片,页面标题同步变更,满足作业要求。本案例覆盖了小程序 Canvas2D 常用绘图能力,从基础图形、样式效果到图片绘制,完整实现实验要求,并且完成扩展功能。

ahsgdhs的博客 217

微信小程序案例 5.2:Canvas 2D 基本绘图完整实现

type="2d"arc()画圆、fillRect()画矩形、画折线fillStyle颜色、lineWidth线宽、lineCap端点、lineJoin交点径向渐变、shadow*阴影、透明度fillText()fontrotate()onload在画布上画图片。

Ct010的博客 148

基本绘图canvas应用

微信小程序的 canvas 2D 绘图上下文()提供了丰富的基本绘图能力:绘制实心圆、轮廓图、虚线、文字等图形,并支持设置端点样式、交点样式、图形渐变、阴影、透明度等绘图样式。本案例设计了一个小程序,演示利用画布 API 实现基本绘图的功能和实现方法。小程序运行后,点击不同按钮,可以在画布上绘制不同类型的图形,并观察不同的绘图样式效果。增加"绘制图片"按钮,点击后在画布上显示图片,标题随之改变(使用创建图片对象 +绘制)。arcfillstroke绘制实心圆和轮廓圆;绘制虚线;lineCap。

2601_97270417的博客 104

微信小程序 Canvas 2D 基本绘图实践

各类图形通过设置路径与填充或描边样式绘制,虚线与端点交点样式控制线条外观,文字绘制涉及字体、基线与旋转,渐变、阴影与透明度通过对应的上下文属性实现,图片绘制在加载回调中按比例缩放并居中;本次实践以一组按钮分别触发各类绘制操作,涵盖画布初始化与高分屏适配、路径与样式设置、渐变与阴影效果、文字绘制、透明度控制及图片绘制与居中缩放。渐变通过创建径向渐变对象实现,指定内外圆的圆心与半径,界定渐变范围,再通过添加色标定义各位置的过渡颜色,色标位置取值在 0 到 1 之间。设置后绘制填充图形,图形即呈现半透明效果。

2501_91034542的博客 229

微信小程序 Canvas 2D 绘图实战|案例 5.2 基础图形绘制踩坑全记录

最近在做软件工程专业的小程序课程作业,对应案例《基本绘图》,目标是实现圆形、虚线、文字、径向渐变、阴影、半透明图形、加载外部图片这一系列画布功能。renderer参数报错、CSS 横杠符号异常、旧版 canvas-id 不支持径向渐变、图片跨域等等,折腾了很久才把全部功能调通,在这里整理一份完整踩坑笔记,给同样做这个实验的同学参考。开发环境:微信开发者工具,基础库 v2.30+ 功能清单:清空画布、实心圆、描边圆、虚线、端点样式、文字绘制、径向渐变矩形、阴影图形、半透明矩形、加载网络图片。

js1020473379的博客 121

微信小程序 Canvas 2D 绘图实战:从基础图形到本地图片渲染

通过上述代码,我们成功实现了一个功能丰富的 Canvas 绘图页面。高分屏适配:必须结合dpr设置并执行,否则图形会模糊。异步加载加载图片是异步的,务必在img.onload之后调用drawImage,否则画布上只会是一片空白。

lmhshje的博客 118

微信小程序 Canvas 基本绘图实战:从图形到图片

基本绘图

djxzyr的博客 195
上一篇: Canvas 实现自由绘图|附扩展切换画笔颜色完整实战
下一篇: Canvas 2D 图形变换
zcmdcsdn_
博客等级 码龄72天 0粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值