【问题标题】:Test if browser supports "multiply" for globalCompositeOperation canvas property测试浏览器是否支持 globalCompositeOperation 画布属性的“乘法”
【发布时间】:2014-11-25 05:51:47
【问题描述】:

在 HTML 画布上绘图时,我需要使用 multiply 混合模式:

ctx.globalCompositeOperation = "multiply";
ctx.drawImage(...);

我在最新的 Chrome/Firefox 中得到了预期的结果,但在 IE 11 中没有:它不会崩溃,但我得到的结果与未指定 globalCompositeOperation 属性时的结果相同。

如何以编程方式测试浏览器是否支持multiply 混合模式?

【问题讨论】:

  • 直到今天,移动浏览器仍然不支持“乘”值吗?即使在 2016 年的今天,在 ios 设备上获得从桌面呈现的相同效果也存在问题(在 ios safari 和 chrome 上根本不显示)

标签: html canvas html5-canvas globalcompositeoperation


【解决方案1】:

与上下文中的许多操作一样,对 globalCompositeOperation 的错误输入会被忽略,因此很容易查看是否支持给定模式:只需设置它,然后读取当前模式以检查它是否是您提供的模式。
所以为了清楚起见,你可以使用像这样的一些功能:

// setCompositeMode : sets the globalCompositeOperation on provided context.
// return true if mode is supported, false otherwise.
function setCompositeMode(ctx, newMode) {
    ctx.globalCompositeOperation = newMode;
    return ( ctx.globalCompositeOperation == newMode ) ;
}

只是一个小例子:

var cv=document.createElement('canvas');
var ctx= cv.getContext('2d');

console.log(" Current (default) composite mode : " + ctx.globalCompositeOperation ) ;
console.log("setting 'destination-in'.");
ctx.globalCompositeOperation = 'destination-in';
console.log(" composite mode : " + ctx.globalCompositeOperation ) ;
console.log("setting 'multiply'.");
ctx.globalCompositeOperation = 'multiply';
console.log(" composite mode : " + ctx.globalCompositeOperation ) ;
console.log("setting 'i-don-t-exist' .");
ctx.globalCompositeOperation = 'i-don-t-exist';
console.log(" composite mode : " + ctx.globalCompositeOperation ) ;

输出(Chrome/mac OS,支持乘法):

" Current (default) composite mode : source-over"
"setting 'destination-in'."
" composite mode : destination-in"
"setting 'multiply'."
" composite mode : multiply"
"setting 'i-don-t-exist' ."
" composite mode : multiply"

【讨论】:

    【解决方案2】:

    由于上下文 API 将复合模式作为内部浏览器属性,您可能必须实际执行 .globalCompositeOperation='multiply' 并查看结果是否有效:

    // pre-flight compatibility tests
    ctx.fillStyle='black';
    ctx.fillRect(0,0,1,1);
    ctx.globalCompositeOperation='multiply';
    ctx.fillStyle='white';
    ctx.fillRect(0,0,1,1);
    var supportsMultiplyCompositing=(ctx.getImageData(0,0,1,1).data[0]===0);
    

    【讨论】:

    • 好吧,我希望有一些干净的方法可以做到这一点..但你的解决方案无论如何都有效。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 2012-04-05
    • 2011-04-25
    • 2011-11-26
    • 1970-01-01
    • 2014-02-01
    • 2012-01-02
    相关资源
    最近更新 更多