На канвасе рисую два контура прямоугольника непрозрачным цветом. В двух местах прямоугольники пересекаются, и по идее, второй(верхний) прямоугольник должен перекрывать первый(нижний), но их контуры почему то смешиваются.
const c=document.getElementById("myCanvas");
const ctx=c.getContext("2d");
ctx.strokeStyle="red";
ctx.strokeRect(20,20,150,100);
ctx.strokeStyle="gray";
ctx.strokeRect(50,50,200,200);
<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
Отрисовывай свои однопиксельные линии в координатах вроде ctx.lineTo(10.5, 10.5). Рисование однопиксельных линий в координатах (10, 10) значит, что этот 1 пиксель находится в координатах с 9.5 до 10.5, что приводит к рисованию двух линий на канвасе.
Интересный способ не прибавлять каждый раз 0.5 к настоящим координатам, если много однописксельных линий, использовать ctx.translate(0.5, 0.5) в самом начале.
перевод ответа @allan
const c = document.getElementById("myCanvas");
const ctx = c.getContext("2d");
ctx.translate(0.5, 0.5);
ctx.strokeStyle = "red";
ctx.strokeRect(20, 20, 150, 100);
ctx.strokeStyle = "gray";
ctx.strokeRect(50, 50, 200, 200);
<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
Антиалиасин
const c=document.getElementById("myCanvas");
const ctx=c.getContext("2d");
ctx.lineWidth=10;
ctx.strokeStyle="red";
ctx.strokeRect(20,20,150,100);
ctx.strokeStyle="gray";
ctx.strokeRect(50,50,200,200);
<canvas id="myCanvas" width="300" height="150" style="border:1px solid #d3d3d3;">
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости