我可以关闭 HTML <canvas> 元素上的抗锯齿功能吗?

IT技术 javascript html canvas antialiasing
2021-01-26 21:38:18

我在玩<canvas>元素,画线等等。

我注意到我的对角线是抗锯齿的。对于我正在做的事情,我更喜欢锯齿状的外观 - 有没有办法关闭此功能?

6个回答

画出你1-pixel像坐标系ctx.lineTo(10.5, 10.5)在该点上绘制一条单像素线(10, 10)意味着,该1位置的像素到达 from9.510.5这导致在画布上绘制两条线。

0.5如果您有很多单像素线,则不必总是将加到要绘制的实际坐标中的一个好技巧ctx.translate(0.5, 0.5)在开始时添加整个画布。

这并没有消除抗锯齿,但确实使抗锯齿线看起来好多了 --- 例如,当您实际上想要一个像素时,去除那些令人尴尬的两个像素厚的水平或垂直线。
2021-03-15 21:38:18
添加 +0.5 对我有用,但ctx.translate(0.5,0.5)没有。在 FF39.0 上
2021-03-27 21:38:18
非常感谢你!我不敢相信我有实际的 1px 线可以改变!
2021-04-05 21:38:18
@porneL:不,在像素角之间画线。当您的线条宽度为 1 像素时,它会向任一方向延伸半个像素
2021-04-06 21:38:18
嗯,我在使用这种技术摆脱抗锯齿时遇到了麻烦。也许,我想念理解一些东西?你介意在某个地方发布一个例子吗?
2021-04-09 21:38:18

对于图像,现在有.context.imageSmoothingEnabled= false

但是,没有什么可以明确控制线条绘制。您可能需要使用绘制自己的线条(困难的方法getImageDataputImageData

我想知道 javascript 行算法的性能.. 可能会在某个时候让 Bresenham 试一试。
2021-03-15 21:38:18
如果我绘制到一个较小的画布(缓存),然后使用该设置将 drawImage 绘制到另一个画布,它会按预期工作吗?
2021-03-15 21:38:18
最近浏览器供应商都在吹捧新的超快速 JS 引擎,所以最终它会有一个很好的用途。
2021-03-19 21:38:18
这真的有效吗?我正在绘制一条线,putImageData 但它仍然会导致附近像素混叠。
2021-03-24 21:38:18

它可以在 Mozilla Firefox 中完成。将此添加到您的代码中:

contextXYZ.mozImageSmoothingEnabled = false;

在 Opera 中,它目前是一个功能请求,但希望它很快就会被添加。

凉爽的。+1 为您的贡献。我想知道禁用 AA 是否会加快画线速度
2021-03-11 21:38:18
OP 想要取消抗锯齿线,但这仅适用于图像。根据规范,它确定"whether pattern fills and the drawImage() method will attempt to smooth images if their pixels don't line up exactly with the display, when scaling images up"
2021-03-13 21:38:18

它必须抗锯齿矢量图形

需要抗锯齿才能正确绘制涉及非整数坐标 (0.4, 0.4) 的矢量图形,但很少有客户这样做。

当给定非整数坐标时,画布有两个选项:

  • 抗锯齿- 根据整数坐标与非整数坐标的距离(即舍入误差)绘制坐标周围的像素。
  • Round - 对非整数坐标应用一些舍入函数(例如,1.4 将变为 1)。

后面的策略适用于静态图形,但对于小图形(半径为 2 的圆),曲线将显示清晰的台阶而不是平滑的曲线。

真正的问题是当图形被平移(移动)时 - 一个像素和另一个像素之间的跳跃(1.6 => 2, 1.4 => 1),意味着形状的原点可能相对于父容器跳跃(不断移动1 像素上/下和左/右)。

一些技巧

提示 #1:您可以通过缩放画布(例如 x)来软化(或强化)抗锯齿,然后自己将倒数比例 (1/x) 应用于几何图形(不使用画布)。

比较(无缩放):

几个长方形

与(画布比例:0.75;手动比例:1.33):

具有较软边缘的相同矩形

和(画布比例:1.33;手动比例:0.75):

边缘较暗的相同矩形

提示#2:如果您真的想要锯齿状的外观,请尝试将每个形状绘制几次(不要擦除)。每次绘制时,抗锯齿像素都会变暗。

比较。绘制一次后:

几条路

绘制三次后:

相同的路径但更暗且没有可见的抗锯齿。

这似乎难以置信,但有你想要抗锯齿关闭罕见的情况。事实上,我刚刚编写了一个游戏,人们必须在画布上绘制区域,而我只需要 4 种颜色,但由于抗锯齿,我被卡住了。重复三次图案并没有解决问题(我达到了200)并且仍然存在错误颜色的像素。
2021-03-15 21:38:18
@vanowm 随意克隆和玩:github.com/Izhaki/gefri所有图像都是 /demo 文件夹中的屏幕截图(针对提示 #2 稍微修改了代码)。我相信您会发现将整数舍入引入绘制的图形很容易(我花了 4 分钟),然后只需拖动即可查看效果。
2021-03-24 21:38:18

我会使用自定义线算法(例如 Bresenham 线算法)绘制所有内容。看看这个 javascript 实现:http : //members.chello.at/easyfilter/canvas.html

我认为这肯定会解决您的问题。

正是我需要的,我唯一要补充的是你需要实现setPixel(x, y)我在这里使用了接受的答案:stackoverflow.com/questions/4899799/...
2021-03-13 21:38:18