我尝试将alpha混合与HTML5画布一起使用。虽然颜色看起来大致正常,但用context.getImageData()
检查实际像素值会显示标准Porter-Duff模型的差异,这些差异似乎太大而无法通过8位算术的限制来解释。
以下是摘要:
阅读空白画布=> R=G=B=A=0
。这有点奇怪。由于我的未上漆的画布显示为纯白色,我原本期望R=G=B=255
。当然,对于A=0
,R,G和B无论如何都是无关紧要的。尽管如此,我不确定R=G=B=A=0
如何显示纯白色。
使用R=200,G=B=0,A=0.75
对其进行绘制。阅读结果为R=201,G=B=0,A=0.75
。 A=0.75
似乎是正确的; Porter-Duff想要A_final=.75+(.25*0)=.75
。 G=B=0
也很好。但我相信R应该是R=(.75*200)+(0*(.75-1)*0)=150
。显然150 != 201
。相反,他们似乎使用等式Final_color=new_color
表示R,G和B.
使用R=100,G=200,B=0,A=0.2
再次绘制它。阅读结果为R=175,G=50,B=0,A=0.8
。同样,A计算似乎是正确的; .2+(1-.2)*.75=.8
。但是,Porter-Duff预测R=(.2*100)+(.75*(1-.2)*201)=(.2*100)+(.6*201)=141
。再次,显然141 != 175
。绿色同样不一致。然而,R和G都用公式Final_color=.25*new_color+.75*old_color
来解释 - 遗憾的是,这不是Porter-Duff混合所预测的。
其他几点说明:
我已经检查了the spec,就画布
所做的事情而言,它似乎与我一致。我已经尝试过基本相同的Chrome V37和IE V11。
使用A=0
绘画效果很好,就像使用A=1
绘画一样。
我发现2011 post抱怨类似的问题,但认为这是一个浏览器错误。我很难相信这样一个明显的错误仍然会在三年之后仍然存在 - 在两种不同的浏览器中出现相同的情况。
以下是我如何阅读的代码详情:
pixels=(context.getImageData (10,10,1,1)).data; console.log(pixels);
写作:
context.beginPath();
context.arc (10,10, 10, 0, 2*Math.PI);
context.fillStyle = "rgba(200,0,0,.75)";
context.fill ();