如何在 HTML5 画布上绘制一个模糊的圆圈?

IT技术 javascript html canvas geometry blur
2021-02-27 20:11:37

我可以在 HTML5 画布上绘制一个简单的圆圈,但我想在它周围添加一些模糊效果。

我发现的是这个网站,它解释了shadowBlur可以在这里派上用场财产。

但是,我无法使圆圈本身变得模糊。shadowBlur属性的主要作用是在绘制规则圆后绘制一些模糊效果。到目前为止我尝试过的东西我已经穿上了 jsFiddle

可以看出,它是一个实心圆,周围有一些模糊效果——这两个部分根本不融合在一起。我真正想要实现的是圆圈本身完全模糊,如下所示:

模糊的圆圈

有没有什么办法可以像这样画一个模糊的圆,即圆本身也有模糊效果?

5个回答

我强烈建议不要使用模糊算法,除非您正在模糊一些已经存在的复杂绘图。

对于您的情况,只需绘制一个具有径向渐变的矩形。

  var radgrad = ctx.createRadialGradient(60,60,0,60,60,60);
  radgrad.addColorStop(0, 'rgba(255,0,0,1)');
  radgrad.addColorStop(0.8, 'rgba(228,0,0,.9)');
  radgrad.addColorStop(1, 'rgba(228,0,0,0)');

  // draw shape
  ctx.fillStyle = radgrad;
  ctx.fillRect(0,0,150,150);

例子:

http://jsfiddle.net/r8Kqy/48/

但请记住,这不是真正的(高斯)模糊!这种模糊是由具有直边的“锥体”制成的,真正的(高斯)模糊看起来会柔和得多。您可以通过添加更多 colorStops 来近似它。
2021-05-10 20:11:37
这完全没问题。但就我而言,我需要直接使用 imageData 而不是上下文。有什么办法可以通过直接修改 imageData 来添加模糊圆圈?
2021-05-10 20:11:37
+1 用于使用 RGBA 在模糊区域中获得适当的透明度。干得好。
2021-05-17 20:11:37

您可能会发现context.filter属性很有用

var canvas = document.getElementById('canvas');

var context = canvas.getContext('2d');

context.filter = "blur(16px)";

context.fillStyle = "#f00";
context.beginPath();
context.arc(100, 100, 50, 0, Math.PI * 2, true);
context.fill();
<!DOCTYPE html>
<html>

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
</head>

<body>
  <canvas width=200 height=200 id='canvas'></canvas>
</body>

</html>

请注意,截至 2017 年 4 月,IE、Opera 和 Safari 不支持此功能

截至 2020 年 7 月,Safari 仍不受支持
2021-05-01 20:11:37

您可能可以获得位图像素数组并在其上应用一些模糊算法。例如:http : //www.jhlabs.com/ip/blurring.html

这是为 HTML5 Canvas 编写的更好、速度更快的模糊:StackBlur
2021-04-29 20:11:37
很有意思。但是,当我使用渲染器 (20fps) 时,我想它会变得有点过于复杂和缓慢......但我会试一试,谢谢。
2021-04-30 20:11:37
@pimvdb 将其模糊到屏幕外画布一次,然后使用drawImage().
2021-05-01 20:11:37

您可以使用以下函数绘制一个模糊的圆圈:

function drawblurrycircle(context, x, y, radius, blur)
{
     context.shadowBlur = blur;
     context.shadowOffsetX = 0;
     context.shadowOffsetY = 0;

     context.fillStyle="#FF0000";
     context.shadowColor="#FF0000"; //set the shadow colour to that of the fill

     context.beginPath();
     context.arc(x,y,radius,0,Math.PI*2,true);
     context.fill();
     context.stroke();
}
对不起!我没有仔细阅读你的帖子。为了使它看起来更好,您可以使用for循环多次模糊它
2021-04-23 20:11:37
很抱歉,但我已经发布了我尝试过的信息shadowBlur,问题是阴影没有融入圆环中。不幸的是,您的解决方案也遇到了同样的问题。jsfiddle.net/r8Kqy/410
2021-04-30 20:11:37

如果您仍然对使用 EaselJS 完成此效果感兴趣,这可能有助于JSFiddle EaselJS 模糊

var stage = new createjs.Stage("test");
var s = new createjs.Shape();
var g = s.graphics;
g.f("#FF0000").dc(0, 0, 75);
s.x = 100;
s.y = 100;
s.filters = [new createjs.BoxBlurFilter(5, 5, 3)];
stage.addChild(s);
s.cache(-100, -100, 200, 200);
s.alpha = 0.5;
stage.update();
@GrahamLea oop!你是对的,看看这个jsfiddle.net/s0c9wndh似乎 BoxBlurFilter 在最新版本中不再使用,使用 BlurFilter 代替 [code] var stage = new createjs.Stage("test"); var s = new createjs.Shape(); var g = s.graphics; gf("#FF0000").dc(0, 0, 75); sx = 100; sy = 100; s.filters = [new createjs.BlurFilter(5, 5, 3)]; stage.addChild(s); s.cache(-100, -100, 200, 200); s.alpha = 0.5; 阶段.更新();[/代码]
2021-05-05 20:11:37
可能是因为时隔6年,但是上面的JSFiddle好像并没有什么作用。
2021-05-12 20:11:37