gpt4 book ai didi

javascript - 如何在 中绘制一条在 Safari/Chrome/Firefox 中看起来相同的对 Angular 线?

转载 作者:行者123 更新时间:2023-11-28 18:40:18 25 4
gpt4 key购买 nike

在支持 HTML5 的浏览器中,此代码绘制一条对 Angular 线:

<!DOCTYPE html><html><body><script>
var canvas = document.createElement('canvas');
canvas.width = 100;
canvas.height = 100;
var ctx = canvas.getContext('2d');
ctx.strokeStyle = 'black';
ctx.beginPath();
ctx.moveTo(0, 0);
ctx.lineTo(100, 100);
ctx.lineWidth = 1;
ctx.stroke();
document.body.appendChild(canvas);
</script></body></html>

但是,Safari 中的渲染效果看起来截然不同:

Comparison of diagonal line in Chrome, Firefox, Safari

(从左到右依次为 Chrome 49.0、Firefox 45.0、Safari 9.0。)

也就是说,在 Safari 中,这条线看起来大约是其他线粗的两倍。

我可以做些什么来使该行在所有三个浏览器中看起来都相同吗?

最佳答案

差异是由浏览器消除线路别名的不同方式造成的。

您无法覆盖或关闭 Canvas 元素上的抗锯齿功能,因此您会陷入跨浏览器的不同线条渲染。

唯一可靠的解决方法是逐像素绘制自己的线条。您可以使用Bresenham's line algorithm创建您的线路。

这里是示例代码和演示:

var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");

var imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);
var data = imgData.data;

bresnehamLine(25,25, 250, 125);
ctx.putImageData(imgData, 0, 0);


function setPixel(x, y) {
var n = (y * canvas.width + x) * 4;
data[n] = 0;
data[n + 1] = 0;
data[n + 2] = 255;
data[n + 3] = 255;
}

// Attribution: https://www.cs.helsinki.fi/group/goa/mallinnus/lines/bresenh.html
function bresnehamLine(x0, y0, x1, y1) {
var dx = Math.abs(x1 - x0),
sx = x0 < x1 ? 1 : -1;
var dy = Math.abs(y1 - y0),
sy = y0 < y1 ? 1 : -1;
var err = (dx > dy ? dx : -dy) / 2;
while (true) {
var n = (y0*canvas.width+x0)*4;
data[n] = 0;
data[n + 1] = 0;
data[n + 2] = 255;
data[n + 3] = 255;
if (x0 === x1 && y0 === y1) break;
var e2 = err;
if (e2 > -dx) {
err -= dy;
x0 += sx;
}
if (e2 < dy) {
err += dx;
y0 += sy;
}
}
}
body{ background-color: ivory; }
#canvas{border:1px solid red; margin:0 auto; }
<canvas id="canvas" width=300 height=300></canvas>

关于javascript - 如何在 <canvas> 中绘制一条在 Safari/Chrome/Firefox 中看起来相同的对 Angular 线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36211616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com