问题描述

我正在玩<canvas> 元素,绘制线等。

我注意到我的对角线是抗锯齿的。我喜欢看起来像我在做什么 – 有没有办法关闭这个功能?

最佳解决方案

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

但是,没有任何明确的控制线条图。您可能需要使用 getImageDataputImageData 绘制自己的线 (the hard way) 。

次佳解决方案

ctx.lineTo(10.5, 10.5)坐标上绘制 1-pixel 线。在 (10, 10)点绘制 one-pixel 线,意味着该位置的 1 像素从 9.510.5,这样可以在画布上绘制两条线。

一个很好的技巧,不总是需要将 0.5 添加到您想要绘制的实际坐标,如果你有很多 one-pixel 线,就是 ctx.translate(0.5, 0.5)你的整个画布在开始。

第三种解决方案

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

contextXYZ.mozImageSmoothingEnabled = false;

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

第四种方案

我想补充说,当缩小图像尺寸并在画布上绘制时,我遇到了麻烦,它仍然使用平滑,即使在升序时不使用它。

我解决了这个:

function setpixelated(context){
    context['imageSmoothingEnabled'] = false;       /* standard */
    context['mozImageSmoothingEnabled'] = false;    /* Firefox */
    context['oImageSmoothingEnabled'] = false;      /* Opera */
    context['webkitImageSmoothingEnabled'] = false; /* Safari */
    context['msImageSmoothingEnabled'] = false;     /* IE */
}

你可以使用这样的功能:

var canvas = document.getElementById('mycanvas')
setpixelated(canvas.getContext('2d'))

也许这对某人有用

第五种方案

它必须反对矢量图形

对于正确绘制涉及 non-integer 坐标 (0.4,0.4) 的矢量图形,需要进行抗锯齿,所有这些坐标除了极少的客户端都能做。

当给出 non-integer 坐标时,画布有两个选项:

  • Antialias – 绘制坐标周围的像素相对于 non-integer 一个整数坐标的距离 (舍入误差) 。

  • 回合 – 将一些舍入函数应用于 non-integer 坐标 (例如,1.4 将变为 1) 。

后来的策略将适用于静态图形,虽然对于小图形 (半径为 2 的圆) 曲线将显示清晰的步骤,而不是平滑曲线。

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

一些技巧

提示#1:您可以通过缩放画布 (通过 x 表示) 来软化 (或硬化) 抗锯齿,然后将自变量 (1 /x) 应用于几何图形 (不使用画布) 。

比较 (无缩放):

与 (画布尺度:0.75; 手动刻度:1.33):

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

提示#2:如果一个锯齿状的外观真的是你以后,尝试绘制每个形状几次 (不擦除) 。每个画面,抗锯齿像素变暗。

比较。绘制一次后:

画三次后:

第六种方案

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

我想这肯定会解决你的问题。

第七种方案

ctx.translate(0.5, 0.5);
ctx.lineWidth = .5;

有了这个组合,我可以画出漂亮的 1px 细线。

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛