gpt4 book ai didi

JavaScript canvas clearRect 在使用浮点坐标时留下边框

转载 作者:行者123 更新时间:2023-11-28 04:35:10 29 4
gpt4 key购买 nike

我在 HTML5 Canvas 上使用 clearRect 重绘矩形。使用浮点坐标时,clearRect 在 Canvas 上留下我的矩形的边框。

以下代码演示了使用整数坐标的矩形被完全清除而使用浮点坐标的矩形留下了边框的问题。

<html>
<head>
</head>
<body>
<script type="text/javascript" >

var canvas = document.createElement("canvas");
canvas.width = 100;
canvas.height = 100;
canvas.style.border = "1px solid";
document.body.appendChild(canvas);
var ctx = canvas.getContext("2d");
ctx.fillRect(20.1,20.1,30,30);
ctx.clearRect(20.1,20.1,30,30);

ctx.fillRect(50,50,30,30);
ctx.clearRect(50,50,30,30);

</script>
</body>
</html>

生成的 Canvas 如下所示: clearRect example

我可以通过清除更大的区域来解决这个问题,但这会增加清除和必须重新绘制相邻形状的风险。例如,此处建议:I can't completely clear the transformed rectangle in <canvas>

我可以使用整数坐标来修复它,但这不是这个应用程序中的一个选项。

是否有其他方法可以让 clearRect 实际上清除所有绘制的矩形而不清除更大的区域或使用整数坐标?

最佳答案

Canvas 上的所有点实际上都以它们的中间坐标 (0.5, 0.5) 为中心。
如果你想画一条一像素粗的黑线,你必须用居中坐标来画它。
如果你在一个整数边界上绘制它,你实际上会绘制一条两像素粗的线,两者都具有较低的不透明度,导致一条更粗的线以深灰色而不是黑色绘制:

这是一张放大了 3 倍的图片:

enter image description here

更一般地说,任何偏离 0.5 边界的坐标都将使用与其到中点的距离成比例的不透明度进行绘制。
这是一组从整数边界开始的水平线段,然后每 20 个像素移动 1/10 个像素:

enter image description here

放大 4 倍:
enter image description here

我们可以看到只有在居中时我们才真正有一条 1 像素的线。

对于您的问题,您无法“部分”清除像素:像素是此处的最终单位,因此由于颜色已经混合,您只能清除整个像素,或者只是减弱其强度(这是你看到的结果)。

我可以想到两个解决方案:

  • 与其清除,不如重绘所有内容,除了您不再需要的内容。为此,您必须处理某种场景图,这意味着:您需要收集所有需要绘制的对象(例如保存在数组中),并且在绘制时,您删除所有内容,重绘除矩形之外的所有内容.

  • 在幕后处理一个更大的 Canvas ,其分辨率将高于用户 Canvas 。这是你画的,质量更好,画完后你把它复制到低分辨率的用户 Canvas 上。在 0.5 边界上绘制整数大小(例如矩形的宽度/高度)。这个主 Canvas 可能大 4 或 8 倍。 Canvas 的最大尺寸是有限的,所以如果您针对所有浏览器,请注意这一点,它们并不都允许相同的最大尺寸(低于 6400X6400 应该没问题,但不确定)。您可以处理多个后台 Canvas 以超出该限制,只需做一些额外的工作。

(解决方案 2 的 Rq:一定要在复制前禁用图像平滑以避免伪影)。

((绘图的 fiddle 在这里:jsbin.com/xucuxoxo/1/))

编辑:创建上下文后立即从 (0.5;0.5) 翻译上下文是一个好习惯。那么你将始终绘制整数坐标。这样,您可以确保所有(比如说)1 像素粗的线实际上都绘制为 1 像素粗。使用 floor 或 ceil 测试舍入,然后选择您喜欢的一个。

关于JavaScript canvas clearRect 在使用浮点坐标时留下边框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21903684/

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