How to draw a blurry circle on HTML5 canvas?

25,346

Solution 1

I'd strongly suggest against blur algorithms unless you are blurring some already-existing drawing that is complex.

For your case, just draw a rect with a radial gradient.

  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);

Example:

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

Solution 2

You may find the context.filter property useful

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>

Note as of April 2017, IE, Opera and Safari don't support this

Solution 3

You probably can obtain the bitmap pixel array and apply some blurring algorithm on top of it. For example: http://www.jhlabs.com/ip/blurring.html

Solution 4

You can draw a blurred circle with the following function:

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();
}
Share:
25,346
pimvdb
Author by

pimvdb

Updated on July 09, 2022

Comments

  • pimvdb
    pimvdb almost 2 years

    I'm able to draw a simple circle on HTML5 canvas, but I'd like to add some blur around it.

    What I found was this website which explains the shadowBlur property which can come in handy here.

    However, I cannot manage to make the circle itself blurry. What the shadowBlur property basically does is painting some blur effect after the regular circle has been drawn. What I've tried so far I've put on jsFiddle.

    As can be seen, it's a solid filled circle with some blur effect around it - the two parts do not blend into each other at all. What I actually would like to achieve is that the circle itself is fully blurred like this:

    blurred circle

    Is there any way to draw a blurred circle like this, i.e. that the circle itself also has a blur effect?

  • pimvdb
    pimvdb about 13 years
    Very interesting. However, as I'm using it a renderer (20fps) I guess it will become a little overcomplicated and slow... But I'll give it a shot, thanks.
  • Phrogz
    Phrogz about 13 years
    @pimvdb Blur it once to an offscreen canvas and then blit the result to your canvas using drawImage().
  • Phrogz
    Phrogz about 13 years
    Here's a better, very fast blur written for HTML5 Canvas: StackBlur
  • Phrogz
    Phrogz about 13 years
    +1 for using RGBA to get proper transparency in the blur region. Nice work.
  • pimvdb
    pimvdb almost 12 years
    I'm sorry but I already posted that I tried shadowBlur, and that the problem is that the shadow does not blend into the cicle. Your solution suffers from that very same issue, unfortunately. jsfiddle.net/r8Kqy/410
  • starbeamrainbowlabs
    starbeamrainbowlabs almost 12 years
    Sorry! I did not read your post thoroughly. To make it look better, you could use a for loop to blur it multiple times
  • Ivan Kuckir
    Ivan Kuckir over 10 years
    But remember, this is not a real (gaussian) blur! This blur is made by a "cone" with straight edge, real (gaussian) blur will look much softer. You can approximate it by adding more colorStops.
  • Graham Lea
    Graham Lea almost 5 years
    Maybe it's because it's 6 years later, but the above JSFiddle doesn't seem to do anything.
  • sebastian.derossi
    sebastian.derossi almost 5 years
    @GrahamLea Yikes! you're correct, have a looks at this jsfiddle.net/s0c9wndh Seems like BoxBlurFilter is no longer used in the latest version, use BlurFilter instead [code] 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.BlurFilter(5, 5, 3)]; stage.addChild(s); s.cache(-100, -100, 200, 200); s.alpha = 0.5; stage.update(); [/code]
  • Niranth Reddy
    Niranth Reddy over 4 years
    This is perfectly fine. But in my case, I need to work with imageData directly instead of context. Any way to add blur circle by modifying imageData directly ??
  • Crashalot
    Crashalot almost 4 years
    still unsupported on safari as of july 2020