美文网首页
canvas绘制的图好模糊,怎么解决呢?

canvas绘制的图好模糊,怎么解决呢?

作者: 小m_up | 来源:发表于2017-07-12 19:10 被阅读3294次

今天用canvas绘制了一个图表,但是绘制出来后特别模糊,感觉是拿了一张分辨率很差的图出来(忘记截图了),然后才发现,原来使用canvas还会出现这种问题

原因

在浏览器的window变量中有一个devicePixelRatio的属性,该属性决定了浏览器会用几个(通常是2个)像素点来渲染1个像素,举例来说,假设devicePixelRatio的值为2,一张100x100像素大小的图片,在retina屏幕下,会用2个像素点的宽度去渲染图片的1个像素点,因此该图片在retina屏幕上实际会占据200x200像素的空间,相当于图片被放大了一倍,因此图片会变得模糊。在window中有一个devicePixelRatio的属性,类似的,在canvas context中也存在一个webkitBackingStorePixelRatio的属性(仅safari和chrome),该属性的值决定了浏览器在渲染canvas之前会用几个像素来来存储画布信息。

解决

我们只需要得到 devicePixelRatiowebkitBackingStorePixelRatio相除,得到一个比例,然后画图的时候,宽和高都乘以这个比例就好了。

举例

这是我刚开始画的一个Hello world
html代码如下:

<canvas id="canvas" width="300px" height="300px"></canvas>

js代码如下:

function draw() {
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');
    ctx.font = "20px serif";
    ctx.fillText("Hello world", 10, 50);
}
draw();

但是此时显示的字体有点模糊(该例子不是很明显):


那么解决后的代码如下:

function draw() {
    var getPixelRatio = function (context) {
        var backingStore = context.backingStorePixelRatio ||
            context.webkitBackingStorePixelRatio ||
            context.mozBackingStorePixelRatio ||
            context.msBackingStorePixelRatio ||
            context.oBackingStorePixelRatio ||
            context.backingStorePixelRatio || 1;
        return (window.devicePixelRatio || 1) / backingStore;
    };

    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');
    var ratio = getPixelRatio(ctx);

    ctx.font = "30px serif";
    ctx.fillText("Hello world", 10 * ratio, 50 * ratio);
}

draw();

此时的显示为:


demo代码地址:https://github.com/yangzhanmei/canvas-blurry-solve-demo

该例子不是很明显,大家可以在遇到很模糊的情况下使用该方法

相关文章

  • canvas绘制的图好模糊,怎么解决呢?

    今天用canvas绘制了一个图表,但是绘制出来后特别模糊,感觉是拿了一张分辨率很差的图出来(忘记截图了),然后才发...

  • H5 新特性05

    SVG svg与canvas的区别 canvas绘制的是位图, svg绘制的是矢量图 canvas使用Ja...

  • 浅析HTML5的Canvas——案例绘制

    1. Canvas绘制五环 2.Canvas绘制饼状图以及绘制文字 3. Canvas绘制一堆不断变大变小的随机移...

  • canvas绘制仪表盘

    效果图 html添加canvas js获取canvas 定义方法绘制圆环 绘制刻度线 绘制文字 绘制圆 绘制三角形...

  • 背景半弧形界面绘制

    效果图: 利用flutter canvas绘制

  • 无标题文章

    SVG svg和canvas的区别 svg绘制的是矢量图, canvas绘制的是位图 svg使用XML来绘制图片,...

  • canvas模糊解决

    这个是以前开发小程序的时候常见的问题原因是因为移动端的DPR比较高 最近有个同事的PC也是模糊的,他的device...

  • SVG绘制环图

    上篇<原生Canvas绘制饼图>介绍了如何使用Canvas来绘制环图,这篇用SVG标签来实现一下。 上面是完整效果...

  • 关于DOM整理

    canvas的刮刮卡 奖品图是canvas的背景图, 绘制一个纯色Mark 通过ctx.globalComposi...

  • 【微信小程序】canvas.draw无法执行回调

    问题: canvas绘制完成后,无法进入canvas.draw的回调函数原因:由于绘制速度太快解决:方法一: 在d...

网友评论

      本文标题:canvas绘制的图好模糊,怎么解决呢?

      本文链接:https://www.haomeiwen.com/subject/bzzbhxtx.html