优雅的解决canvas画圆锯齿问题
Posted 前端小砖头
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了优雅的解决canvas画圆锯齿问题相关的知识,希望对你有一定的参考价值。
之前做一各项目需要画一个饼图,于是使用html5的canvas元素画出来的.一看在移动端手机上测试都发现画图有一点锯齿明显问题,
代码如下
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();
试试:结果如下
几乎没变化,反正我是看不出来,除了想右偏移了点点
代码如下:
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();
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
);
}
效果如下:
使用window.devicePixelRatio设备上物理像素和设备独立像素(device-independent pixels (dips))的比例(就是我们常说的几倍屏)来设置canvas实际需要放大的倍数,原理与上一种方法一样,区别在于 devicePixelRatio取出的是实际的比例倍数,在pc端显示为1,避免了上种方法PC端不判断同样放大一样倍数画图出现明显锯齿问题,但是devicePixelRatio各个浏览器的兼容性不是很好所以咱们做下兼容,完善一下,
当不兼容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的图更清晰?