解决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);
相关推荐
●VON8 小时前
React Native for OpenHarmony:深入剖析 Switch 组件的状态绑定、无障碍与样式定制
javascript·学习·react native·react.js·von
Aotman_9 小时前
Vue el-table 表尾合计行
前端·javascript·vue.js·elementui·前端框架·ecmascript
编程猪猪侠9 小时前
Vue3 + Ant Design Vue 实现 Table 表格嵌套 Radio 单选框
javascript·vue.js·anti-design-vue
静小谢9 小时前
vue3实现语言切换vue-i18n
前端·javascript·vue.js
Highcharts.js9 小时前
如何使用Highcharts Flutter的官方使用文档
javascript·flutter·开发文档·highcharts
东东5169 小时前
资产管理信息系统ssm+vue
前端·javascript·vue.js
利刃大大9 小时前
【Vue】声明式导航与传参 && 编程式导航与传参 && 嵌套与守卫
javascript·vue.js·ecmascript
a1117769 小时前
拼图小游戏(HTML5、CSS3、JavaScript)
javascript·css3·html5
东东51611 小时前
基于ssm的网上房屋中介管理系统vue
前端·javascript·vue.js
harrain12 小时前
什么!vue3.4开始,v-model不能用在prop上
前端·javascript·vue.js