热门标签 | 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;也可以留言。



推荐阅读
  • WPF项目学习.一
    WPF项目搭建版权声明:本文为博主初学经验,未经博主允许不得转载。一、前言记录在学习与制作WPF过程中遇到的解决方案。使用MVVM的优点是数据和视图分离,双向绑定,低耦合,可重用行 ... [详细]
  • vue引入echarts地图的四种方式
    一、vue中引入echart1、安装echarts:npminstallecharts--save2、在main.js文件中引入echarts实例:  Vue.prototype.$echartsecharts3、在需要用到echart图形的vue文件中引入:   importechartsfrom&amp;quot;echarts&amp;quot;;4、如果用到map(地图),还 ... [详细]
  • 本文探讨了 Canvas 元素在不同尺寸设置下出现变形失真的原因,并详细解释了 HTML 尺寸和 CSS 尺寸的区别及其对视觉效果的影响。 ... [详细]
  • Cookie学习小结
    Cookie学习小结 ... [详细]
  • Iwouldliketohaveatooltopdisplayedonatextboxunderacertainsituation.我希望在特定情况下在文本框中显示工具栏 ... [详细]
  • C#实现文件的压缩与解压
    2019独角兽企业重金招聘Python工程师标准一、准备工作1、下载ICSharpCode.SharpZipLib.dll文件2、项目中引用这个dll二、文件压缩与解压共用类 ... [详细]
  • Spring Data JdbcTemplate 入门指南
    本文将介绍如何使用 Spring JdbcTemplate 进行数据库操作,包括查询和插入数据。我们将通过一个学生表的示例来演示具体步骤。 ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • window下的python安装插件,Go语言社区,Golang程序员人脉社 ... [详细]
  • 利用REM实现移动端布局的高效适配技巧
    在移动设备上实现高效布局适配时,使用rem单位已成为一种流行且有效的技术。本文将分享过去一年中使用rem进行布局适配的经验和心得。rem作为一种相对单位,能够根据根元素的字体大小动态调整,从而确保不同屏幕尺寸下的布局一致性。通过合理设置根元素的字体大小,开发者可以轻松实现响应式设计,提高用户体验。此外,文章还将探讨一些常见的问题和解决方案,帮助开发者更好地掌握这一技术。 ... [详细]
  • 装饰者模式(Decorator):一种灵活的对象结构设计模式
    装饰者模式(Decorator)是一种灵活的对象结构设计模式,旨在为单个对象动态地添加功能,而无需修改原有类的结构。通过封装对象并提供额外的行为,装饰者模式比传统的继承方式更加灵活和可扩展。例如,可以在运行时为特定对象添加边框或滚动条等特性,而不会影响其他对象。这种模式特别适用于需要在不同情况下动态组合功能的场景。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • DVWA学习笔记系列:深入理解CSRF攻击机制
    DVWA学习笔记系列:深入理解CSRF攻击机制 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
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社区 版权所有