优雅的解决canvas画圆锯齿问题

Posted 前端小砖头

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优雅的解决canvas画圆锯齿问题相关的知识,希望对你有一定的参考价值。

canvas
解决canvas画圆锯齿问题

之前做一各项目需要画一个饼图,于是使用html5的canvas元素画出来的.一看在移动端手机上测试都发现画图有一点锯齿明显问题,


1
效果如下


代码如下

 var canvas = document.getElementById('canvas');
 var ctx = canvas.getContext('2d');
 ctx.beginPath();;
 ctx.lineWidth = 40;
 ctx.arc(75,75,50,0,Math.PI * 2);
 ctx.strokeStyle = '#0066FF';
 ctx.stroke();


2
这样子当然不行,多方查找原因,有如下说法




优雅的解决canvas画圆锯齿问题

试试:结果如下

优雅的解决canvas画圆锯齿问题

几乎没变化,反正我是看不出来,除了想右偏移了点点

代码如下:

 var canvas = document.getElementById('canvas');
 var ctx = canvas.getContext('2d');
 ctx.beginPath();;
 ctx.translate(0.5, 0.5);
 ctx.lineWidth = 40;
 ctx.arc(75,75,50,0,Math.PI * 2);
 ctx.strokeStyle = '#0066FF';
 ctx.stroke();


3
还是不能满足,于是便去瞅瞅chart.js的源码,找到如下方案


var width = canvas.width,height=canvas.height;
if (window.devicePixelRatio) {
    canvas.style.width = width + "px";
    canvas.style.height = height + "px";
    canvas.height = height * window.devicePixelRatio;
    canvas.width = width * window.devicePixelRatio;
    ctx.scale(
    window.devicePixelRatio, window.devicePixelRatio
    );
}

效果如下:

优雅的解决canvas画圆锯齿问题

使用window.devicePixelRatio设备上物理像素和设备独立像素(device-independent pixels (dips))的比例(就是我们常说的几倍屏)来设置canvas实际需要放大的倍数,原理与上一种方法一样,区别在于 devicePixelRatio取出的是实际的比例倍数,在pc端显示为1,避免了上种方法PC端不判断同样放大一样倍数画图出现明显锯齿问题,但是devicePixelRatio各个浏览器的兼容性不是很好所以咱们做下兼容,完善一下,


4
效果如下



当不兼容devicePixelRatio的时候咱们就默认设置为4倍缩放目前已知的最大的缩放比就是4倍屏

代码如下

var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
var width = canvas.width,height=canvas.height;
window.devicePixelRatio?
setScale(window.devicePixelRatio):
setScale(4);
function setScale(d){
    canvas.style.width = width + "px";
    canvas.style.height = height + "px";
    canvas.height = height * d;
    canvas.width = width * d;
    ctx.scale( d , d );
}
ctx.beginPath();
ctx.translate(0.5, 0.5);
ctx.lineWidth = 40;
ctx.arc(75,75,50,0,Math.PI * 2);
ctx.strokeStyle = '#0066FF';
ctx.stroke();

到目前关于canvas画弧形锯齿问题算是完美解决了;



以上是关于优雅的解决canvas画圆锯齿问题的主要内容,如果未能解决你的问题,请参考以下文章

关于如何解决canvas的画圆弧时的锯齿感以及如何让canvas的图更清晰?

canvas 画圆的几种方式

微信小程序使用canvas绘制圆角矩形在Android:变形、锯齿

移动端canvas抗锯齿

Android Canvas ClipPath锯齿问题

canvas初探3:画方画圆