Javascript HTML5 Canvas GlobalComposite用于叠加渐变的操作没有增加到更高的强度?
我目前正在进行修复,我想知道是否有人知道使用Javascript HTML5 Canvas GlobalComposite用于叠加渐变的操作没有增加到更高的强度?,javascript,canvas,html5-canvas,heatmap,Javascript,Canvas,Html5 Canvas,Heatmap,我目前正在进行修复,我想知道是否有人知道使用的2d渲染上下文是否可以实现以下效果 我有一个从黑色(alpha 0.5)到透明40像素半径的径向渐变。径向梯度的中心位于x=50,y=50 我有另一个径向渐变,从黑色(alpha 0.5)到透明的40像素半径。径向梯度的中心位于x=80,y=50 这两个渐变重叠。我现在的问题是:重叠区域加在一起,导致alpha值高于径向梯度中心,从而显示错误的数据(例如,由于梯度之间的添加,热图中的区域更热) 看看下面的内容,通过在控制台中执行它,您可以看到问题
的2d渲染上下文是否可以实现以下效果
- 我有一个从黑色(alpha 0.5)到透明40像素半径的径向渐变。径向梯度的中心位于x=50,y=50
- 我有另一个径向渐变,从黑色(alpha 0.5)到透明的40像素半径。径向梯度的中心位于x=80,y=50
- 绘制第一个渐变
- 使用复合操作“目标输出”
- 绘制第二个渐变->从第一个渐变中减去重叠区域
- 使用复合操作“源代码结束”
- 再次绘制第二个渐变
我认为您需要的每像素混合函数将从源和目标中选择alpha值最大的像素
if (src.a <= dst.a) {
result = dst;
} else {
result = src;
}
if(src.a这真的很奇怪,但它做了你想做的事情,却没有涉及到图像数据
我想到的是,当你在画布上绘制路径时,你需要路径本身在画布上的确切功能。引用规范:
由于跟踪路径的算法是如何定义的,因此在一次笔划操作中,路径的重叠部分被视为它们的并集是绘制的
你可以阅读更多关于这方面的内容
无论如何,你想要的,本质上,是一条模糊的路径,除了弧,你可以划过一次,你会完全得到你想要的效果
唯一的问题是没有办法在画布上画出模糊的路径,或者几乎没有办法
代替使用路径本身,我们可以使用路径的阴影来模拟模糊的圆,这些圆遵循与路径相同的规则
因此,唯一的问题是,你不想看到实际的路径,你只想看到它的阴影。使笔划透明是行不通的:阴影只会绘制,不会以比它所阴影的东西更高的不透明度绘制
但是阴影确实具有属性shadowOffsetX
和shadowOffsetY
,它们通常用于将阴影移动一两个像素以产生光源的错觉
但是,如果我们把阴影画得太远以至于你看不见它们呢?或者更确切地说,如果我们把路径画得太远以至于你看不见它们,你所能看到的只是阴影呢
好吧,这正好是关键。下面是一个快速结果,您的原始代码位于顶部,阴影是第二个画布:
它
var gradient1 = context.createRadialGradient(75,100,2,75,100,80);
gradient1.addColorStop(0,"yellow");
gradient1.addColorStop(1,"black");
var gradient2 = context.createRadialGradient(125,100,2,125,100,80);
gradient2.addColorStop(0,"blue");
gradient2.addColorStop(1,"black");
context.beginPath();
context.globalCompositeOperation = "lighter";
context.globalAlpha = 0.5;
context.fillStyle = gradient1;
context.fillRect(0,0,200,200);
context.fillStyle = gradient2;
context.fillRect(0,0,200,200);
context.globalAlpha = 1.0;
context.closePath();
IE 11 (64-bit Windows 10)
Rects = 4 ms
Arcs = 35 ms
Gradients = 57 ms
Images = 8 ms
Shadows = 160 ms
Edge (64-bit Windows 10)
Rects = 3 ms
Arcs = 47 ms
Gradients = 52 ms
Images = 7 ms
Shadows = 171 ms
Chrome 48 (64-bit Windows 10)
Rects = 4 ms
Arcs = 10 ms
Gradients = 8 ms
Images = 8 ms
Shadows = 203 ms
Firefox 44 (64-bit Windows 10)
Rects = 4 ms
Arcs = 21 ms
Gradients = 7 ms
Images = 8 ms
Shadows = 468 ms
Opera 34 (64-bit Windows 10)
Rects = 4 ms
Arcs = 9 ms
Gradients = 8 ms
Images = 8 ms
Shadows = 202 ms
Mobile Safari (iPhone5, iOS 9)
Rects = 12 ms
Arcs = 31 ms
Gradients = 67 ms
Images = 82 ms
Shadows = 32 ms