解决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);
相关推荐
豹哥学前端8 小时前
浏览器console里的双中括号 `[[ ]]`
前端·javascript·ecmascript 6
你很易烊千玺9 小时前
JS 数组所有变态遍历・完整案例 + 场景 + 对比
javascript·数组
光影少年9 小时前
前端算法题
前端·javascript·算法
hexu_blog11 小时前
前端vue后端java如何实现证件照功能
前端·javascript·vue.js
豹哥学前端11 小时前
前端 LocalStorage 实战:从入门到熟练,一篇就够了
前端·javascript·面试
Southern Wind11 小时前
谷记账——一个 Vue 3 批次记账 App
前端·javascript·vue.js
A923A11 小时前
【javaScript 原型精讲】
javascript·原型·原型链
卷帘依旧12 小时前
手写throttle
javascript
其实防守也摸鱼12 小时前
Sqlmap:选取sqli-labs中less-8进行sqlmap注入测试
前端·css·网络·安全·web安全·less·sqli-labs
伯远医学12 小时前
Nat. Methods | 邻近标记技术:活细胞中捕捉分子互作的新利器
java·开发语言·前端·javascript·人工智能·算法·eclipse