Canvas 在高分屏上发虚,怎样核对 CSS 尺寸与绘图缓冲尺寸

2026-10-24

将 Canvas 的 CSS 显示尺寸与绘图缓冲尺寸分别设置,再按实际 devicePixelRatio 建立绘图尺度。只把 CSS 宽度放大不会增加位图像素,修改图片 DPI 标签也不会替网页画布自动补清晰度。

先写两个独立尺寸

本例画布在页面中始终占320×160个CSS像素。DPR为1时位图320×160,为2时位图640×320,绘图坐标仍按320×160使用。程序通过CDP模拟两个设备比例,读取真实devicePixelRatio与元素矩形,不把一张手写换算表当浏览器结果。模拟比例不代表当前物理显示器密度已被测量。

尺寸重设后再建立变换

设置canvas.width与height会重置上下文,因此应先计算并赋位图尺寸,再设置缩放并重新画内容。若每次resize都在旧变换上继续scale,可能越缩越大;可使用明确的setTransform建立本轮尺度。DPR不一定是整数,实际项目需约定取整和CSS尺寸来源,不能把本例1与2的整数关系推广成所有缩放设置。

用像素验证覆盖范围

夹具按逻辑尺寸填满红色,脚本读取位图右下角像素应为不透明红,证明绘制覆盖了实际缓冲。它验证尺寸与尺度一致,不测文字锐度、色彩管理或抗锯齿观感。若右下角透明,可能只画了逻辑宽高却忘记调整绘图尺度;若页面尺寸变大,则检查是否将位图宽高误当CSS宽高直接用。

清晰度和资源预算一起决定

DPR翻倍会让宽和高各翻倍,像素总量变成四倍,后续读取和重绘成本也可能上升。目标互动大屏应结合真实分辨率、内存和帧率测量决定是否限制渲染比例。这里没有比较GPU性能,也没有读取TUIO坐标;鼠标事件仍是CSS参考系,若需要把输入落到位图像素,还要按画布矩形与缓冲尺寸明确转换。

把比例变化视为需要重建的输入

窗口跨屏、系统缩放或浏览器缩放可能改变实际比例,项目应在适当生命周期重新读取,并只在必要时重设缓冲。若把DPR在启动时缓存后永久使用,迁移到另一块屏时可能继续模糊;若每帧都重设width,则又会丢失绘图状态。尺寸检查与内容重画应成一套流程,同时保留当前逻辑尺寸、位图尺寸和实际比例三项,方便复核清晰度来自哪一级。

下载并复现

下载原创HTML夹具、独立验证程序、本次执行记录和依赖与运行说明,放在同一目录。安装Playwright 1.58.0及其Chromium后运行 python verify.py;程序使用两个随机本地端口,自动关闭浏览器与服务,不请求外网或业务接口。

本次实际环境为Python 3.12.4、Playwright 1.58.0、Chromium 145.0.7632.6。CDP设备比例模拟与Canvas2D像素读取;非实体显示器测量。断言已通过;完整事件和数值保留在执行记录,不能把它改名后当目标展项测量。

Canvas题限定2D上下文,WebGL题限定WebGL1;启动使用ANGLE SwiftShader软件后端参数,实际renderer可见对应执行记录。软件后端的像素结果不代表实体显卡性能、驱动稳定性或跨浏览器一致性。

继续核查与一级出处

基础背景见把图片改成300DPI为何仍不清楚,怎样核对像素与物理尺寸。位图尺寸调整会重置2D状态,尺寸与重绘应一起处理,可继续用Canvas 改完 width 后颜色和变换都丢了,怎样验证上下文重置取证;相关工程入口在专题与产品对接说明。

需要展厅软硬件方案或定制开发?

加微信,把这一页发到你手机上

扫码加站长企业微信,会自动把这一页的链接发给你。问软件授权、报价,或者现场遇到问题,也可以直接聊。

去留微信

留言讨论

评论发布后会被人工复核,违规内容将被删除。

    还没有人评论,来说说你的看法

    如果发表没有反应,可以前往联系我们告诉我们。

    这个页面有问题?

    提交时会附带当前页面地址和浏览器信息,帮助我们定位问题。不填联系方式即为匿名。