Как нарисовать размытый круг на холсте HTML5?
Я могу нарисовать простой круг на холсте 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);
Пример:
Вы можете найти свойство 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 года IE, Opera и Safari не поддерживают это
Вы, вероятно, можете получить массив пикселей растрового изображения и применить некоторый алгоритм размытия поверх него. Например: http://www.jhlabs.com/ip/blurring.html
Вы можете нарисовать размытый круг с помощью следующей функции:
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();
}
Если вы все еще заинтересованы в том, чтобы этот эффект был сделан с 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();