canvas教程

解决canvas画图模糊的问题

字号+ 作者:H5之家 来源:H5之家 2016-05-28 16:01 我要评论( )

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

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();

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


     

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • html5canvas核心技术图形、动画与游戏开发源码

      html5canvas核心技术图形、动画与游戏开发源码

      2017-05-02 17:42

    • 打印html5中Canvas的方法

      打印html5中Canvas的方法

      2017-05-01 15:03

    • HTML5+Canvas调用手机拍照功能实现图片上传(下)

      HTML5+Canvas调用手机拍照功能实现图片上传(下)

      2017-04-30 17:00

    • 学习慕课网canvas倒计时实例笔记

      学习慕课网canvas倒计时实例笔记

      2017-04-30 14:01

    网友点评
    <