Javascript 画布GlobalComposite操作模式是否应在drawImage中工作?

Javascript 画布GlobalComposite操作模式是否应在drawImage中工作?,javascript,canvas,Javascript,Canvas,我正在使用globalCompositeOperation='copy',然后是一个drawImage,这样我的新图像就会替换下面的图像 这在Mac、Windows和iPad上的最新Safari和Chrome浏览器中运行良好 它在IE9中不起作用,虽然它在Firefox 3.6中起作用,但在Firefox 4.0中不起作用 当它不工作时,似乎会发生的是整个画布被擦除,而不仅仅是我传递给drawImage的矩形区域 我认为这是IE 9和firefox 4.0中的一个bug,但我是否应该不期望它工作

我正在使用globalCompositeOperation='copy',然后是一个drawImage,这样我的新图像就会替换下面的图像

这在Mac、Windows和iPad上的最新Safari和Chrome浏览器中运行良好

它在IE9中不起作用,虽然它在Firefox 3.6中起作用,但在Firefox 4.0中不起作用

当它不工作时,似乎会发生的是整个画布被擦除,而不仅仅是我传递给drawImage的矩形区域


我认为这是IE 9和firefox 4.0中的一个bug,但我是否应该不期望它工作?

这些是Mozilla假设画布工作的图像:

问题是规范在这里写得相当模糊。例如,对于复制复合类型,其内容如下:

显示源图像而不是目标图像。

这可能是source over的同义词,也可能意味着“清除整个画布,然后将新的绘图操作复制到画布上”

要了解不同浏览器在实现上的差异,请将上面mozilla提供的图像与mozilla提供的所有不同组合形状的实时触发(而不是图像、画布)一起使用:

快速看一下,Chrome11似乎与Firefox4在源代码输入、源代码输出、目的地输入、目的地顶部、深色和复制方面存在分歧

乍一看,需要注意的是,所有的差异都与是否应该清除不相关的像素有关。Mozilla似乎是这样认为的,Google却不这么认为。

当您将drawImage()与globalCompositeOperation=“copy”一起使用时,会意外地将画布清除在目标矩形之外。但这似乎是如何解释该标准的共识。即使使用fillRect()或在绘制直线时,整个画布也会被清除。必须设置一个剪裁区域以防止出现这种情况


有关讨论,请参见:

我看到Opera11.10遵循FF4行为。这是一个相关的Chrome标签-对于图像是另一个位图的情况,webkit行为似乎更合理。。。在我的代码中,解决方案是在drawImage之前执行clearRect并使用“copy”,或者在drawImage之前设置剪辑。clearRect方式的速度要慢得多,尤其是在iPad上,它比设置剪辑慢得多。实际上它并不含糊,只是很难阅读。它指的是一篇给出完整算法的论文。“复制”操作对应于Porter和Duff的(0,A,0,A)元组,这意味着目标像素被擦除,即使源像素是透明的。在所有这些情况下,Firefox都是正确的,Chrome似乎有问题(从我对规范的阅读来看)。然而,规范并没有说“复制”应该删除drawImage rect之外的像素。