canvas 1px像素模糊现象解决方案

2018-8-17 00:46| 作者: admin| 查看: 2595| 评论: 0|来自: 蚂蚁部落

当绘制宽度1px的线条时,可能真正绘制出来的线条并不是1px。

不但在视觉上模糊且宽度明显大于1px。

下面就介绍一下出现此问题的原因。

先看一段代码实例:

[HTML] 纯文本查看 复制代码运行代码
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>蚂蚁部落</title>
<style>
canvas {
  border: 2px dotted #ccc;
}
</style>
<script type="text/javascript">
window.onload = function () {
  var canvas = document.getElementById('canvas');
  var ctx = canvas.getContext('2d');
  ctx.moveTo(50, 50);
  ctx.lineTo(50, 250);
  ctx.stroke();
}
</script>
</head>
<body>
<canvas id="canvas" width="550" height="450"></canvas>
</body>
</html>

默认条件下,线条的宽度是1px,很明显上面的宽度不是1px,并且还是模糊的。

如果放大canvas画布,那么画布可以认为是由一个一个的像素组成的。

模拟如下图:

a:3:{s:3:\"pic\";s:43:\"portal/201808/21/143343l6rr6pvivp31vfnx.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

如果从x轴坐标1点绘制一个宽度为1px的线条,我们可能想当然的认为将绘制出如下图案:

a:3:{s:3:\"pic\";s:43:\"portal/201808/21/143352x5fkfsfblvvxblbe.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

然而事实并非如此,canvas绘制的线条会从路径的中央向两端扩展。

图示如下:

a:3:{s:3:\"pic\";s:43:\"portal/201808/21/143359a8jz817cyxc71l8s.jpg\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

但计算机并不会只绘制0-1和1-2的半个像素,而将绘制0-1和1-2的整个像素,那么加起来就是2px。

那么为何会模糊呢,这是因为0-0.5和1.5-2之间的内容会被更浅颜色的内容填充,所以看到模糊效果。

更多内容参阅canvas绘制线条lineWidth宽度原理一章节。

既然明确导致这个现象的原因,解决方案也就很容得出。

代码实例如下:

[HTML] 纯文本查看 复制代码运行代码
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="author" content="http://www.softwhy.com/" />
<title>蚂蚁部落</title>
<style>
canvas {
  border: 2px dotted #ccc;
}
</style>
<script type="text/javascript">
window.onload = function () {
  var canvas = document.getElementById('canvas');
  var ctx = canvas.getContext('2d');
  ctx.moveTo(50.5, 50);
  ctx.lineTo(50.5, 250);
  ctx.stroke();
}
</script>
</head>
<body>
<canvas id="canvas" width="550" height="450"></canvas>
</body>
</html>

让绘制的路径起点从一个像素的中心开始,那么当向两端扩展的时候,恰好填满一个像素。


鲜花

握手

雷人

路过

鸡蛋
返回顶部