实现网格线绘制,要考虑画布style尺寸和画布像素大小的缩放关系

单像素绘制主要出现的问题是会模糊,从像素角度看就是出现绘制两个像素,实际就是要做偏移

核心就是:按物理像素绘制,首先要对齐物理像素,计算物理像素与css像素之间的关系,然后绘制的时候如果绘制的线宽是奇数就要考虑做偏移,不缩放的情况下是0.5个css像素,缩放就需要计算比例,核心代码如下

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta http-equiv="X-UA-Compatible" content="ie=edge" /><title>Static Template</title></head><body><canvas id="canvas"> </canvas><script>// 设置 Canvas 的物理像素缩放,确保在高分屏下清晰绘制const canvas = document.getElementById("canvas");const context = canvas.getContext("2d");const ratio = window.devicePixelRatio || 1;// 设置画布css大小const width = 300;const height = 200;// 设置 CSS 尺寸, 这里设置的css大小,在绘制的时候,会根据ratio进行缩放,必须保证比例精确,否则绘制出来的线会模糊canvas.style.width = `${width}px`;canvas.style.height = `${height}px`;// 设置高分辨率画布尺寸canvas.width = width * ratio;canvas.height = height * ratio;// 缩放上下文,保持绘图逻辑不变context.setTransform(ratio, 0, 0, ratio, 0, 0);const deviceLineWidth = 1const devicePxWidth = 1 / ratioconst gridLineWidth = 1 / ratioconst offset = 0.5 // 偏移量,用于对齐像素// 现在 context 中坐标单位是 CSS 像素// 对齐设备像素,当浏览器或系统设置非整数分辨率时,单个像素也不是整数,不能简单的取整function alignDevicePixel(px) {return Math.round(px / devicePxWidth) * devicePxWidth;}// 绘制一条真正 1px 的线(在物理像素中)function draw1pxGridLine() {context.lineWidth = deviceLineWidth / ratio;context.strokeStyle = 'black';const halfLineWidth = deviceLineWidth / 2;const _needTranslateOffset = Math.abs(Math.round(halfLineWidth) - halfLineWidth) > 1e-4; // 这里在算是奇数还是偶数const dprOffset = _needTranslateOffset ?  offset / ratio : 0// 对齐像素,+0.5 使线落在像素中心for (let x = 0; x <= width; x += 30) {context.beginPath();x = alignDevicePixel(x)x -= gridLineWidthcontext.moveTo(x + dprOffset, 0);context.lineTo(x + dprOffset, height);context.stroke();}for (let y = 0; y <= height; y += 20) {context.beginPath();y = alignDevicePixel(y)y -= gridLineWidthcontext.moveTo(0, y + dprOffset);context.lineTo(width, y + dprOffset);context.stroke();}}draw1pxGridLine();</script></body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/86147.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/86147.shtml
英文地址,请注明出处:http://en.pswp.cn/web/86147.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度图聚类DGC—Paper Notes

目录 Unsupervised Deep Embedding for Clustering Analysis (DEC 2016)Attributed Graph Clustering: A Deep Attentional Embedding Approach (DAEGC 2019)Structural Deep Clustering Network (SDCN 2020)Contrastive Multi-View Representation Learning on Graphs (MVG…

获取YARN application 应用列表的几种方法

目录 1. 使用YARN命令行工具 2. 通过REST API获取 YARN 提供了获取YARN集群上运行的应用列表,以下是几种常见方法: 1. 使用YARN命令行工具 最直接的方式是使用YARN提供的命令行工具: yarn application -list 上述命令会显示所有正在运行的应用。 如果要查看所有应用(…

前端如何下载 ‘Content-Type‘: ‘application/octet-stream‘ 的文件

前言 在前端开发中&#xff0c;经常会遇到需要从后端接口下载文件的需求。当后端返回的响应头中 Content-Type 为 application/octet-stream 时&#xff0c;表示这是一个二进制流文件&#xff0c;浏览器无法直接展示&#xff0c;需要前端处理后下载到本地。本文将详细介绍前端…

咨询顾问进阶——顾问公司战略咨询分析模板【附全文阅读】

该战略咨询分析模板围绕企业战略分析展开&#xff0c;先从总体思考战略分析的目的与方法&#xff0c;接着探讨企业及战略定义、战略地位等。外部环境分析通过 PEST、五种竞争力等模型&#xff0c;分析环境、行业、市场等情况以发现机会与威胁&#xff1b;内部环境分析从资源、核…

宝塔服务器调优工具 1.1(Opcache优化)

第一步&#xff1a;宝塔服务器调优工具 1.1&#xff08;按照下面的参数填写&#xff09; 第二步&#xff1a;路径/www/server/php/80/etc/php.ini 搜索jit jit1235 其中1235根据服务器情况修改 第三步&#xff1a;路径/www/server/php/80/etc/php-cli.ini 搜索 jit1235 其中…

React Native【详解】动画

基础动画的实现流程 使用支持动画的组件 <Animated.Viewstyle{[{opacity: fadeAnim, // 绑定透明度动画值},]}><Text>动画元素</Text></Animated.View>Animated.View&#xff1a;用于创建动画容器&#xff0c;支持所有 View 的属性。Animated.Te…

如何轻松地将照片从 iPhone 传输到计算机

如果您的照片占据了 iPhone 上最多的存储空间&#xff0c;为什么不将照片从 iPhone 传输到电脑呢&#xff1f;您可能想要这样做&#xff0c;但不知道如何开始&#xff1f;如果是这样&#xff0c;那么本指南就是您所需要的。我们分享了 6 种方法以及步骤详细信息。您可以按照一种…

操作系统之内存管理(王道)

本篇博客依据王道、与我的笔记而写&#xff0c;讲解了内存的基础知识、内存管理的概念、进程的映像、连续分配管理方式、动态分区分配算法、基本分页存储管理、基本地址变换机构、TLB快表、两级页表、基本分段存储管理方式、段页式存储管理方式、虚拟内存、请求分页管理方式、页…

C++11 std::thread 多线程编程详解

C++11 标准首次将多线程支持引入语言标准库,其中最核心的部分就是 <thread> 头文件中的 std::thread 类。 🧱 一、基本概念 什么是线程? 线程是操作系统调度 CPU 时间的基本单位。一个进程中可以有多个线程,它们共享进程的资源(如内存、堆栈),但拥有各自独立的…

设置vscode使用eslint

在 Visual Studio Code (VSCode) 中设置 ESLint 是一个很好的方式来确保代码质量和一致性。以下是详细的步骤&#xff1a; 1. 安装 ESLint 扩展 打开 VSCode。点击左侧的扩展图标&#xff08;四边形图标&#xff09;。在搜索框中输入 ESLint。找到由 dbaeumer 提供的 ESLint …

.NET 生态中主流的前后端生产级框架

文章目录 **1. 后端框架&#xff08;Backend Frameworks&#xff09;****(1) ASP.NET Core**&#xff08;微软官方&#xff0c;主流选择&#xff09;**(2) ABP Framework**&#xff08;企业级应用开发框架&#xff09; **2. 前端框架&#xff08;Frontend Frameworks&#xff0…

Spring Cloud Alibaba整合Sentinel指南

目录 一、Sentinel核心功能概述 1. 控制台安装 2. 项目依赖配置 三、详细整合步骤 1. 基础配置 2. 资源定义与保护 3. 与OpenFeign整合 四、常见问题解决方案 五、最佳实践案例 1. 流量控制场景 2. 熔断降级场景 3. 热点参数限流 六、高级功能 Spring Cloud Aliba…

Win10+PHPStudy 8.1完美运行CRMEB开源商城(附性能优化配置)

环境配置 下载phpstudy https://www.xp.cn/ 安装完成之后打开&#xff0c;在软件管理中安装 nginx mysql 5.7 php 7.4 创建站点 填写域名&#xff0c;根目录选择到public文件夹下 创建完成之后&#xff0c;点击右侧管理&#xff0c;选择伪静态 location / { if (!-e $request…

康谋方案 | ARXML 规则下 ECU 总线通讯与 ADTF 测试方案

目录 一、引言 二、汽车电子控制系统 三、ECU开发流程中总线通讯&#xff1a;ARXML 规则下的标准化协作 四、ADTF&#xff1a;汽车数据与时间触发框架&#xff08;Automotive Data and Time-Triggered Framework&#xff09; 五、应用案例 六、结语 一、引言 随着汽车新…

常见JavaScript 代理模式应用场景解析

常见JavaScript 代理模式应用场景解析 在 JavaScript 开发中&#xff0c;代理模式&#xff08;Proxy Pattern&#xff09; 是一种强大的设计模式&#xff0c;它允许我们通过创建一个“代理”来控制对目标对象的访问。通过代理&#xff0c;我们可以拦截并增强对象的行为&#x…

暴雨信创电脑代理商成功中标长沙市中医康复医院

6月25日&#xff0c;国内科技产业领军企业暴雨信息传来喜讯&#xff0c;其信创电脑成功中标长沙市中医康复医院信息化设备采购项目。此次中标&#xff0c;不仅彰显了暴雨信息在信创领域的技术实力和产品优势&#xff0c;也为长沙市中医康复医院的信息化建设注入了新的活力。 长…

ZYNQ PL高速采集AD7606数据与QT动态显示全解析

从硬件设计到软件优化,打造工业级数据采集系统 在工业自动化、医疗仪器等领域,高速多通道数据采集系统至关重要。本文手把手教你基于Xilinx ZYNQ平台,实现8通道200kSPS高速采集**,并通过QT实现60fps动态波形显示。突破性采用五级流水采集架构和GPU加速渲染,解决传统方案的…

还是工作日志

今天感觉效率有点低&#xff0c;可能是太热了 【100】 开始不懂了 https://www.bilibili.com/video/BV1rL411E7uz?t1193.7&p100 什么新增&#xff0c;什么新增和变化 【101】退单 开头就说不适合做事务型 https://www.bilibili.com/video/BV1rL411E7uz?t26.6&…

青少年编程与数学 01-012 通用应用软件简介 10 云存储软件

青少年编程与数学 01-012 通用应用软件简介 10 云存储软件 一、什么是云存储软件&#xff08;一&#xff09;云存储软件的基本定义&#xff08;二&#xff09;云存储软件的工作原理&#xff08;三&#xff09;云存储软件的类型 二、云存储软件的重要意义&#xff08;一&#xf…

华为云Flexus+DeepSeek征文 | 掌握高效开发:利用华为云ModelArts Studio在VS Code中配置Cline AI编程助手

华为云FlexusDeepSeek征文 | 掌握高效开发&#xff1a;利用华为云ModelArts Studio在VS Code中配置Cline AI编程助手 引言一、ModelArts Studio平台介绍华为云ModelArts Studio简介ModelArts Studio主要特点 二、Cline介绍Cline介绍Cline主要特点 三、开通DeepSeek-R1-0528商用…