热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python画图模糊_解决canvas画图模糊的问题

canvas画图经常发现他是模糊的。解决这个问题主要从两个方面下手。改变canvas渲染的像素情况:画1像素的线条看起来模糊不清,好像更宽的样子。解决方

canvas 画图经常发现他是模糊的。解决这个问题主要从两个方面下手。

改变canvas渲染的像素

情况:画1像素的线条看起来模糊不清,好像更宽的样子。

解决方案

var ctx = canvas.getContext('2d');

ctx.translate(0.5, 0.5);

原理:大家都知道屏幕最小单位就是像素。假如把canvas放的足够大,我能看到下面样子。

每一个方格就是长和宽都为1px。当我们画1px线条时遵循像素的起止范围,我们能得到标准的细线。

但遗憾的是canvas的画法不一样。canvas的每条线都有一条无限细的“中线”,线条的宽度是从中线向两侧延伸的。如果我们还是从第2个像素点画一条线,那么线条的中线就会靠齐到第2个像素的起点,然后我们开始画了,问题也就来了:Canvas 的线条以中线向两侧延伸,而不是向某一边延伸(比如这里,如果只是往右侧延伸,那么我们的问题就不再是问题了),延伸过后我们的线条实际上是这样的:

但是计算机不允许出现<1px的图形。所以会做个折中&#xff0c;把两个像素都绘制了。如此一来&#xff0c;本来1px的线条&#xff0c;就成了看起来2px宽的线条。

如何解决这个问题&#xff0c;就是把线条中线和和像素中间点对齐就行了。

中间点位置很好找&#xff0c;向后移动0.5px。所以你们画线时可以这样&#xff1a;

ctx.moveTo(100.5,100.5);

ctx.lineTo(200.5,100.5);

ctx.lineTo(200.5,200.5);

ctx.lineTo(100.5,200.5);

ctx.lineTo(100.5,100.5);

或者

ctx.translate(0.5, 0.5);

2.设置显示比例

在浏览器的window变量中有一个devicePixelRatio的属性&#xff0c;该属性决定了浏览器会用几个(通常是2个)像素点来渲染1个像素&#xff0c;举例来说&#xff0c;假设某个屏幕的devicePixelRatio的值为2&#xff0c;一张100x100像素大小的图片&#xff0c;在此屏幕下&#xff0c;会用2个像素点的宽度去渲染图片的1个像素点&#xff0c;因此该图片在此屏幕上实际会占据200x200像素的空间&#xff0c;相当于图片被放大了一倍&#xff0c;因此图片会变得模糊。

**其实方案很简单&#xff0c;也很容易明白。我们可以创建一个两倍于实际大小的canvas&#xff0c;然后用css样式把canvas限定在实际的大小。

下面是实现具体代码例子&#xff1a;

var canvas &#61; document.getElementById("canvas")

context&#61; canvas.getContext("2d");

var devicePixelRatio &#61; window.devicePixelRatio || 1;

var backingStoreRatio &#61; context.webkitBackingStorePixelRatio ||

context.mozBackingStorePixelRatio ||

context.msBackingStorePixelRatio ||

context.oBackingStorePixelRatio ||

context.backingStorePixelRatio || 1;

var ratio &#61; devicePixelRatio / backingStoreRatio;

canvas.width &#61; canvas.width * ratio;

canvas.width &#61; canvas.height* ratio;

context.scale(ratio, ratio);

ctx.translate(0.5, 0.5);

ctx.lineWidth &#61; 1;

ctx.moveTo(2.5, 2);

ctx.lineTo(98.5, 2);

ctx.lineTo(98.5, 98);

ctx.lineTo(2.5, 98);

ctx.lineTo(2.5, 2);

ctx.stroke();

原来具体详细解释&#xff1a;请看这里

关注

欢迎关注小站小滑轮&#xff0c;小站都是平时工作中积累的一些小工具。是不是你们工作中也会遇到呢。关于小站的内容也可以在博客下面留言哦。有什么使用的工具想让我补充&#xff0c;也可以留言。



推荐阅读
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 深入理解Tornado模板系统
    本文详细介绍了Tornado框架中模板系统的使用方法。Tornado自带的轻量级、高效且灵活的模板语言位于tornado.template模块,支持嵌入Python代码片段,帮助开发者快速构建动态网页。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 导航栏样式练习:项目实例解析
    本文详细介绍了如何创建一个具有动态效果的导航栏,包括HTML、CSS和JavaScript代码的实现,并附有详细的说明和效果图。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 如何高效创建和使用字体图标
    在Web和移动开发中,为什么选择字体图标?主要原因是其卓越的性能,可以显著减少HTTP请求并优化页面加载速度。本文详细介绍了从设计到应用的字体图标制作流程,并提供了专业建议。 ... [详细]
  • 深入解析Android自定义View面试题
    本文探讨了Android Launcher开发中自定义View的重要性,并通过一道经典的面试题,帮助开发者更好地理解自定义View的实现细节。文章不仅涵盖了基础知识,还提供了实际操作建议。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文介绍了如何利用JavaScript或jQuery来判断网页中的文本框是否处于焦点状态,以及如何检测鼠标是否悬停在指定的HTML元素上。 ... [详细]
  • 本文详细介绍了如何使用Python编写爬虫程序,从豆瓣电影Top250页面抓取电影信息。文章涵盖了从基础的网页请求到处理反爬虫机制,再到多页数据抓取的全过程,并提供了完整的代码示例。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
author-avatar
呢嘚吖頭ing_311
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有