解决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);
相关推荐
网小鱼的学习笔记15 分钟前
CSS语法中的选择器与属性详解
前端·css
MiyueFE1 小时前
为什么 JavaScript 中 Map 比 Object 更好
javascript
快起来别睡了1 小时前
CSS 底层原理与选择器详解:从零理解样式如何渲染页面
css
極光未晚1 小时前
JavaScript 中 this 指向的全面解析
javascript
99乘法口诀万物皆可变2 小时前
C#设计模式之AbstractFactory_抽象工厂_对象创建新模式-练习制作PANL(一)
服务器·javascript·c#·html
JiaLin_Denny2 小时前
css 制作一个可以旋转的水泵效果
前端·css·动画·animation·transition
@PHARAOH2 小时前
WHAT - React Native 开发 App 从 0 到上线全流程周期
javascript·react native·react.js
集成显卡2 小时前
图片压缩工具 | Electron应用配合 commander 提供命令行调用功能
前端·javascript·electron·人机交互·命令行·cmd
我是来人间凑数的2 小时前
electron 嵌入web网页的三种方式
前端·javascript·electron
天上掉下来个程小白3 小时前
Apache ECharts-01.介绍
前端·javascript·spring boot·apache·苍穹外卖