html 5 canvas LineTo() 线条颜色问题

IT技术 javascript html canvas
2021-02-08 10:27:42

我正在为 HMTL 5 2D 画布绘制五条水平线:

var canvas_ctx = my_canvas.getContext("2d");
    canvas_ctx.lineWidth = 0.5;
    canvas_ctx.strokeStyle = "black";

    {
        let line_x = 0;
        let line_length = canvas_ctx.width;
        let offset = 5;
        let numLines = 5;
        let numYincrement = 10;
        for (let i=0;i<numLines * numYincrement;i+=numYincrement) {
            //canvas_ctx.beginPath();
            canvas_ctx.moveTo(line_x,i + offset);
            canvas_ctx.lineTo(line_length,i + offset);
            canvas_ctx.stroke();
            //canvas_ctx.closePath();
        }
    }

理想情况下,这应该会产生 5 条黑线。相反,线条的颜色似乎随着每条新线条而褪色(好像它是一个渐变!),因此第 5 行是灰色的。如果我取消注释canvas_ctx.beginPath();and canvas_ctx.closePath();,所有行都变成灰色。为什么会这样??

1个回答

笔划确实从坐标的两侧重叠。

但显然,一个像素不能同时设置为两种颜色。因此浏览器应用antialiasing,这会将您的像素颜色淡化为另一种颜色,这是混合背景色和前景色的结果。因此,对于白色或透明背景上的黑色笔划,这会导致渲染实际的灰色像素。这里我将继续使用红色作为示例:

避免它的一种方法通常是在您的坐标上应用偏移量,以便线在像素边界上正确延伸。例如,对于 1px 线宽,您将应用 0.5 偏移量:

但是在您的情况下,您以 0.5px 的 lineWidth 进行绘制,因此没有偏移量能够摆脱这种抗锯齿。

因此,如果您想要完美的颜色,请选择正确的线宽。

我很欣赏彻底的回答,Kaiido!
2021-04-13 10:27:42