HTML5画布和线宽

时间:2011-09-23 14:29:23

标签: html5 canvas

我在画布上绘制线条图。线条画得很好。缩放图形,绘制每个线段,颜色正常等等。我唯一的问题是在视觉上线宽变化。它几乎就像书法笔的笔尖。如果笔划向上,则线条很薄,如果笔划是水平的,则线条较粗。

我的线条粗细不变,我的strokeStyle设置为black。我没有看到画布的任何其他属性影响这种变化的线宽,但必须有。

4 个答案:

答案 0 :(得分:52)

<强> Live Demo

我的现场演示基本上只是重新创建了MDN所说的内容。对于偶数笔划宽度,您可以使用整数作为坐标,对于您想要使用的奇数笔划宽度.5以获得正确填充像素的清晰线条。

MDN Image

来自MDN Article

  

如果考虑从(3,1)到(3,5)的路径,线宽为   1.0,你最终得到了第二张图片中的情况。实际上   要填充的区域(深蓝色)仅延伸到像素上的一半   路径的两边。必须渲染一个近似值,   这意味着那些像素只是部分遮蔽,结果   在整个区域(淡蓝色和深蓝色)被填充   颜色只有实际描边颜色的一半。这是什么   发生在前面示例代码中的1.0宽度行。

     

要解决此问题,您必须非常精确地创建路径。   知道1.0宽度线将延伸半个单元到任一侧   的路径,创建从(3.5,1)到(3.5,5)的路径导致   第三张图片中的情况 - 1.0线宽完全结束   并精确填充单个像素垂直线。

答案 1 :(得分:1)

尝试lineCap = "round"lineJoin = "round"。请参阅this PDF中的“线条样式”,了解这些参数的用途。


编辑2015年7月17日:很棒的备忘单,但链接已经死了。据我所知,http://www.cheat-sheets.org/saved-copy/HTML5_Canvas_Cheat_Sheet.pdf有一份副本。

答案 2 :(得分:1)

我刚刚解决了类似性质的问题。它涉及For循环中的错误。

问题:我创建了一个for循环来创建一系列连接的线段,并注意到该线条很粗,但最终段显着减少(没有明确使用渐变)。

首先,DEAD结束时的思考:起初我认为这是上面的像素问题,但即使在强制所有段保持在一个恒定的水平之后问题仍然存在。

观察:我注意到我犯了一个新手的错误 - 我在For循环和单个“ctx.stroke”之前只使用了一个“ctx.beginPath()”和“ctx.moveTo(posX,posY)” ()“在For循环之后,循环本身包裹了一个ctx.lineTo()。

解决方案:一旦我将所有方法(.beginPath(),. moveTo(),. lineTo()和.stroke())一起移动到For循环中,这样它们就会在每次迭代时被击中,问题就消失了。我的连线具有所需的均匀厚度。

答案 3 :(得分:1)

如果线宽是奇数,只需将0.5加到x或y。