我想在canvas标签中创建外发光效果,适用于弧形的图形。
应该是这样的:
到目前为止,我的圆是白色的。我尝试使用偏移量为“0”的dropShadow,但看起来不对。
你有什么建议吗?也许在下面放置从蓝色到黑色渐变的形状? 先提前感谢您!
编辑:最后搞定了。使用for循环绘制具有不同半径和透明度的圆。
您可以像这样使用阴影创建外发光效果:
context.shadowBlur = 10;
context.shadowColor = "black";
看一下这个链接,里面有一个例子:http://www.williammalone.com/articles/html5-canvas-example/
我认为这比“用for循环绘制具有不同半径和透明度的圆形”要快。
希望这可以帮到你!
带有0偏移量、大模糊半径和“光”阴影颜色的阴影基本上看起来像发光。我需要在任意填充路径上放置一个绿色的“发光”,我的代码如下:
<!DOCTYPE HTML>
<html>
<head>
<style>
body {
margin: 0px;
padding: 0px;
}
</style>
</head>
<body>
<canvas id="myCanvas" width="578" height="200"></canvas>
<script>
var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');
context.beginPath();
context.moveTo(20, 80);
context.lineTo(80, 20);
context.lineTo(550, 20);
context.lineTo(550, 130);
context.lineTo(490, 190);
context.lineTo(20, 190);
context.lineTo(20, 80);
//context.rect(188, 40, 200, 100);
context.fillStyle = 'red';
context.strokeStyle = '#00ff00';
context.lineWidth = 10;
context.shadowColor = '#00ff00';
context.shadowBlur = 40;
context.shadowOffsetX = 0;
context.shadowOffsetY = 0;
context.stroke();
context.fill();
</script>
</body>
</html>
如果你用圆弧替换我的线性几何图形,你就能够创建出那种效果,而不需要使用图像文件。
这些圆形是图像文件吗?如果是的话,可以在Photoshop、GIMP等软件中创建带有发光效果的图像文件。将它们保存为 .PNG 格式以保留背景的透明度。
如果这些圆形是使用画布绘制函数在屏幕上绘制的,那么考虑重新绘制圆形25次,每个圆形的宽度增加一个像素。
我很好奇如何解决这个问题,因为我正在尝试类似的东西,而它仍然是Google上最受欢迎的答案。结果证明,在黑色背景下的画布上,除非你想要白色的发光效果,否则最好手动绘制,而不是使用shadowBlur
,因为结果太暗了。
所以这里是代码、结果和JSFIddle,这是我想到的解决方案,我想它与被接受的答案相似。它通过使用相同的 alpha 值但改变线条的厚度来实现,具有累加效应。请注意使用lineCap
,它也会在线条的末端添加发光效果。
const canvas = document.getElementById('canvas')
const c = canvas.getContext('2d')
canvas.width = 240
canvas.height = 340
const gradient = c.createLinearGradient(0, 0, 150, 300);
gradient.addColorStop(0, '#444')
gradient.addColorStop(1,'#000')
c.fillStyle = gradient
c.fillRect(0, 0, canvas.width, canvas.height)
const drawC = function (radius, maxWidth, minWidth) {
const inc = (maxWidth - minWidth) / 5
for (let width = maxWidth; width >= minWidth; width -= inc) {
c.lineWidth = width
if (width > 10) {
c.strokeStyle = 'rgba(50, 50, 255, 0.2)'
} else {
c.strokeStyle = 'white'
}
c.lineCap = 'square'
c.beginPath()
c.arc(0, 0, radius, 2 * Math.PI * 0.04, 2 * Math.PI * 0.96)
c.stroke()
}
}
c.translate(120, 170)
drawC(70, 30, 10)
c.rotate(2 * Math.PI * 0.75)
drawC(100, 20, 4)
ctx.fillStyle='black';
ctx.fillRect(0,0,500,500);
ctx.lineWidth=25;
ctx.strokeStyle='white';
ctx.shadowColor='blue';
ctx.shadowOffsetX=0;
ctx.shadowOffsetY=0;
ctx.shadowBlur=25;
for(a=0;a<10;a++) {
ctx.beginPath();
ctx.arc(250,250,200,Math.PI/12,23*Math.PI/12);
ctx.stroke();
ctx.beginPath();
ctx.arc(250,250,100,7*Math.PI/12,5*Math.PI/12);
ctx.stroke();
}