解决canvas绘图模糊问题

canvas 绘制的是物理像素就是屏幕的分辨率

物理像素(DP)

设备独立像素(DIP)

设备像素比(DPR)

DPR = DP / DIP

html 复制代码
<canvas width="600" height="300" style="width: 300px; height: 150px"></canvas>

style中的width和height是canvas元素在界面上占据的宽高 即 设备独立像素(DIP)

attribute 中的 width 和 height 则代表 Canvas 实际像素的宽高(物理像素(DP))

DPR 越大越模糊

解决绘制模糊

原理: 让 Canvas 像素和屏幕物理像素一一对应

js 复制代码
const canvas = document.getElementById('canvas');
const ctx = canvas.getContext('2d');
const dpr = window.devicePixelRatio; // 假设 dpr 为 2
// 获取 css 的宽高
const {width: cssWidth, height: cssHeight} = canvas.getBoundingClientRect();
// 根据 dpr,扩大 canvas 画布的像素,使 1 个 canvas 像素和 1 个物理像素相等
canvas.width = dpr * cssWidth;
canvas.height = dpr * cssHeight;
// 由于画布扩大,canvas 的坐标系也跟着扩大,如果按照原先的坐标系绘图内容会缩小,所以需要将绘制比例放大
ctx.scale(dpr,dpr);
相关推荐
hxjhnct5 小时前
如何实现直播零延迟播放
前端·javascript
hxjhnct6 小时前
JavaScript Promise 的常用API
开发语言·前端·javascript
web小白成长日记7 小时前
前端让我明显感受到了信息闭塞的恐怖......
前端·javascript·css·react.js·前端框架·html
自信阿杜7 小时前
跨标签页数据同步完全指南:如何选择最优通信方案
前端·javascript
指尖跳动的光8 小时前
Vue的nextTick()方法
前端·javascript·vue.js
qq_406176149 小时前
JS 事件循环(Event Loop)
开发语言·前端·javascript
愚坤10 小时前
前端真有意思,又干了一年图片编辑器
前端·javascript·产品
OpenTiny社区10 小时前
这是OpenTiny与开发者一起写下的2025答卷!
前端·javascript·vue.js
哟哟耶耶11 小时前
Plugin-安装Vue.js devtools6.6.3扩展(组件层级可视化)
前端·javascript·vue.js
梦65011 小时前
【前端实战】图片元素精准定位:无论缩放,元素始终钉在指定位置
前端·html·css3