HTML5画布合成算法与Porter-Duff模型不一致

时间:2014-10-13 13:22:12

标签: javascript html html5-canvas porter-duff

我尝试将alpha混合与HTML5画布一起使用。虽然颜色看起来大致正常,但用context.getImageData()检查实际像素值会显示标准Porter-Duff模型的差异,这些差异似乎太大而无法通过8位算术的限制来解释。

以下是摘要:

  1. 阅读空白画布=> R=G=B=A=0。这有点奇怪。由于我的未上漆的画布显示为纯白色,我原本期望R=G=B=255。当然,对于A=0,R,G和B无论如何都是无关紧要的。尽管如此,我不确定R=G=B=A=0如何显示纯白色。

  2. 使用R=200,G=B=0,A=0.75对其进行绘制。阅读结果为R=201,G=B=0,A=0.75A=0.75似乎是正确的; Porter-Duff想要A_final=.75+(.25*0)=.75G=B=0也很好。但我相信R应该是R=(.75*200)+(0*(.75-1)*0)=150。显然150 != 201。相反,他们似乎使用等式Final_color=new_color表示R,G和B.

  3. 使用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混合所预测的。

  4. 其他几点说明:

    • 为简单起见,我将上面的所有alpha值都显示在[0,1]范围内。当然,getImageData实际上在[0,255]中返回它们。
    • 我已经检查了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 ();
    

0 个答案:

没有答案