画布上的模糊 svg

Posted

技术标签:

【中文标题】画布上的模糊 svg【英文标题】:Blurry svg in canvas 【发布时间】:2016-10-29 22:22:51 【问题描述】:

为什么 SVG 在画布中不能正确缩放(全是像素化和模糊的)? 我做错了什么?

我想要的只是 SVG 图像,以保持它的纵横比与画布大小无关,并且不会让它变得模糊。

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

var img = new Image();
img.src = "http://imgh.us/perso.svg";
img.onload = function() 
  ctx.drawImage(img, 0, 0);
* 
  margin: 0;
  padding: 0;
  box-sizing: border-box;

html,
body 
  width: 100%;
  height: 100%;

#screen 
  display: block;
  width: 100%;
  height: 100%;
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8" />
  <link rel="stylesheet" type="text/css" href="css/style.css" />
  <title>Game</title>
</head>

<body>
  <canvas id="screen"></canvas>
  <script type="text/javascript" src="js/game.js"></script>
</body>

</html>

【问题讨论】:

你为什么要把它放到画布上?一旦它在画布元素中,它就会被光栅化。它不再是可缩放的 Vector 图形,而是像素。只需将 SVG 元素放入 DOM 本身即可。 我想用画布和 SVG 图像制作游戏。我认为它仍然是 SVG ......我想我必须阅读更多关于画布到底是什么的信息。谢谢你的澄清! 我不是想阻止你。如果您有真正的理由想要在画布中使用 SVG,那么您应该在问题中将其添加为细节。也许看看this answer 我想在画布中使用 SVG,这样它就可以轻松放大以适应任何分辨率。我想这并不像我想象的那么容易。别担心,我不会放弃。还将详细说明我未来的问题。 @newbStudent 对此有何更新?您是否能够使用下面给出的解决方案从 svg 渲染清晰的图像?如果是,您具体做了什么? 【参考方案1】:

您的问题不在于 SVG,而在于画布。

画布的默认大小为 300 × 150。首先运行的是脚本,它创建画布上下文,大小为 300 × 150。然后 CSS 出现,并将画布元素在每个方向上缩放为 100% .上下文仍然是 300 × 150。这使得每个像素占据超过 1 个像素的区域。您需要确保您的脚本在 CSS 之后运行,或者您需要使用 javascript 来调整画布的大小。

【讨论】:

感谢您的回答!我将看看如何在 CSS 之后运行 js,或者干脆换一种解决方案。 @newbStudent 如果你的 js 在一个单独的文件中(你应该有),那么只需在脚本元素中添加一个defer="defer" 属性 @newbStudent,解决方案就是设置你的画布widthheight 属性。如果你不设置,css加载后运行脚本不会有任何改变。【参考方案2】:

我认为你可以将 SVG 放在 div 中,然后模糊 div,这样会得到相同的效果

https://jsfiddle.net/moongod101/q3qh78xd/

【讨论】:

其实我是想避免模糊效果。不过谢谢你的回答!

以上是关于画布上的模糊 svg的主要内容,如果未能解决你的问题,请参考以下文章

调整画布图像大小而不使其模糊

Firefox 上 CSS 动画前后的 SVG 模糊

2022-06-14 Canvas画布模糊问题

Safari 错误。当尝试使用模糊过滤器为 svg 转换设置动画时,safari 非常滞后

画布上的 Kivy 插值

Firefox SVG 图形模糊