资讯专栏INFORMATION COLUMN

解决canvas画图模糊的问题

or0fun / 2063人阅读

摘要:画图经常发现他是模糊的。解决这个问题主要从两个方面下手。改变渲染的像素情况画像素的线条看起来模糊不清,好像更宽的样子。当我们画线条时遵循像素的起止范围,我们能得到标准的细线。但遗憾的是的画法不一样。

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

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


解决方案

var ctx = canvas.getContext("2d");
ctx.translate(0.5, 0.5);

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

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


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


但是计算机不允许出现<1px的图形。所以会做个折中,把两个像素都绘制了。如此一来,本来1px的线条,就成了看起来2px宽的线条。
如何解决这个问题,就是把线条中线和和像素中间点对齐就行了。


中间点位置很好找,向后移动0.5px。所以你们画线时可以这样:

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的属性,该属性决定了浏览器会用几个(通常是2个)像素点来渲染1个像素,举例来说,假设某个屏幕的devicePixelRatio的值为2,一张100x100像素大小的图片,在此屏幕下,会用2个像素点的宽度去渲染图片的1个像素点,因此该图片在此屏幕上实际会占据200x200像素的空间,相当于图片被放大了一倍,因此图片会变得模糊。
**其实方案很简单,也很容易明白。我们可以创建一个两倍于实际大小的canvas,然后用css样式把canvas限定在实际的大小。
下面是实现具体代码例子:

var canvas = document.getElementById("canvas")
        context= canvas.getContext("2d");  
    var devicePixelRatio = window.devicePixelRatio || 1;
    var backingStoreRatio = context.webkitBackingStorePixelRatio ||
                        context.mozBackingStorePixelRatio ||
                        context.msBackingStorePixelRatio ||
                        context.oBackingStorePixelRatio ||
                        context.backingStorePixelRatio || 1;
    var ratio = devicePixelRatio / backingStoreRatio;
    canvas.width = canvas.width * ratio;
    canvas.width = canvas.height* ratio;
    context.scale(ratio, ratio);
    ctx.translate(0.5, 0.5);
    ctx.lineWidth = 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();

原来具体详细解释:请看这里

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/87709.html

相关文章

  • 常见canvas优化——模糊问题、旋转效果

    摘要:常见优化方案模糊问题旋转效果离屏自定义图片尺寸实践离屏旋转效果实践旋转的雪花更新关于模糊问题前几天研究的时候刚好赶上作者发布新版本,发现新版本截屏出来的效果比我对旧版本处理后画布尺寸都设为倍的效果更好。 canvas常见优化方案——模糊问题、旋转效果、离屏、自定义图片尺寸 实践demo——canvas离屏、旋转效果实践——旋转的雪花 2017-12-18 16:27:35更新关于模糊问...

    jindong 评论0 收藏0
  • 小程序echarts+canvasdrawer实现页面转化图片并保存到相册

    摘要:小程序实现页面转化图片并保存到相册场景小程序测试活动,实现雷达图展示不同的结果微信头像二维码测试结果文字,最终绘制出一张图片用户保存相册。圆形头像建议切镂空图覆盖,,有很难实现效果建议查看微信小程序社区的帖子。 小程序echarts+canvasdrawer实现页面转化图片并保存到相册 场景:小程序测试活动,实现echarts雷达图展示不同的结果、微信头像、二维码、测试结果文字,最终绘...

    Doyle 评论0 收藏0

发表评论

0条评论

or0fun

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<