【发布时间】:2020-12-22 10:19:48
【问题描述】:
我想在画布上显示一个按比例缩小的图像。这样做时,飞船底部会出现锯齿状边缘,似乎是禁用了抗锯齿。
这是在 Firefox 中生成的图像的放大图:
图像非常清晰,但我们看到锯齿状边缘(尤其是宇宙飞船的底部、挡风玻璃、鼻翼)。
在 Chrome 中:
图像保持清晰(舷窗保持清晰,所有线条)并且我们没有锯齿状边缘。只有云有点模糊。
我尝试将属性 imageSmoothingEnabled 设置为 true,但在 Firefox 中不起作用,我的示例:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
</head>
<body>
<!-- <canvas id="canvas1" width="1280" height="720" style="width: 640px; height: 360px;"></canvas> -->
<canvas id="canvas1" width="640" height="360" style="width: 640px; height: 360px;"></canvas>
<script>
const canvas = document.getElementById("canvas1")
const ctx = canvas.getContext("2d")
console.log("canvas size", canvas.width, canvas.height);
const img = new Image()
img.onload = () => {
const smooth = true;
ctx.mozImageSmoothingEnabled = smooth;
ctx.webkitImageSmoothingEnabled = smooth;
ctx.msImageSmoothingEnabled = smooth;
ctx.imageSmoothingEnabled = smooth;
// ctx.filter = 'blur(1px)';
ctx.drawImage(img, 0, 0, 3840, 2160, 0, 0, canvas.width, canvas.height);
}
img.src = "https://upload.wikimedia.org/wikipedia/commons/f/f8/BFR_at_stage_separation_2-2018.jpg";
</script>
</body>
</html>
如何应用抗锯齿功能?
编辑:在 Chrome 中查看网站时会应用抗锯齿,但在 Firefox 中则不会。
编辑 2:更精确地比较图像。实际上,Firefox 似乎应用了一些图像增强功能,但在将 imageSmoothingEnabled 设置为 false 时并未禁用它
编辑 3:将 antialising 的提及替换为 smoothing,因为似乎涉及的不仅仅是 AA。
到目前为止的解决方法(我很想听听您的建议!):
- 用更多像素渲染画布,然后通过 CSS 缩小它 -> 手动移动质量/性能光标
- 使用离线工具调整图像大小 -> 非交互式
- 对图像应用 1px 模糊 -> 不再有锯齿状边缘,但显然是模糊图像
【问题讨论】:
-
您在代码中的画布分辨率为 640 x 360,但您提供的图像是 1382 x 750。设置画布 CSS 宽度和高度以匹配画布宽度和高度。例如
canvas{width:640px;height:360px;}画布宽度和高度设置画布分辨率(它包含的像素数),而 CSS 宽度和高度设置画布显示尺寸(页面上有多大) 为了获得最佳效果,您必须确保显示尺寸匹配决议。 -
感谢您的回答,但我只是放大了浏览器以显示问题,问题与 640x360 的画布相同。我将编辑我的问题,使其更加明确。
-
您的评论启发了一个解决方法:渲染一个 1280x720 的画布,然后使用 CSS 将其缩小到 640x360。这种方式 Firefox 进行抗锯齿,但我仍然希望直接通过上下文 API 进行抗锯齿。
-
那么你无能为力。 FireFox 不支持
ctx.imageSmoothingQuality = "high"质量损失是因为画布是为速度而不是质量而设计的,并且您正在拍摄高分辨率图像并将其压缩到较低分辨率的画布中,如果您通过 Photoshop 缩小原始图像(无论绘图包) 来匹配画布 res 你会得到更好的结果,因为油漆包在减小尺寸方面会做得更好。 -
这是在回答您的问题吗? stackoverflow.com/questions/17861447/…
标签: firefox html5-canvas antialiasing