canvas.toBlob()仍然没有研究铬......解决方法?

时间:2014-12-10 16:55:20

标签: javascript html5 canvas chromium

我在应用上使用canvas.toBlob()功能。在Firefox上工作正常。

使用铬时,功能失败。

我发现了这个问题: Which browsers (and versions) support the Canvas.toBlob method?

解决这个问题并要求浏览器支持此功能,但它已经过时了。

今天的状况如何?铬是唯一的还是其他浏览器仍然不支持它?

但最重要的是......有什么解决方法我可以使用???我的客户正在使用铬来测试应用程序...

1 个答案:

答案 0 :(得分:1)

嗯,toBlob()仍然受到支持。关于Chromium的原始受让人似乎不活跃,此问题似乎目前尚未重新分配(请参阅帖子中的link)。

解决方法是使用polyfill /垫片,例如 this one

上面相同链接的代码列出了这段代码(参见#57,由Adria提供):

if( !HTMLCanvasElement.prototype.toBlob ) {
    Object.defineProperty( HTMLCanvasElement.prototype, 'toBlob', { 
        value: function( callback, type, quality ) {
            const bin = atob( this.toDataURL( type, quality ).split(',')[1] ),
                  len = bin.length,
                  len32 = len >> 2,
                  a8 = new Uint8Array( len ),
                  a32 = new Uint32Array( a8.buffer, 0, len32 );

            for( var i=0, j=0; i < len32; i++ ) {
                a32[i] = bin.charCodeAt(j++)  |
                    bin.charCodeAt(j++) << 8  |
                    bin.charCodeAt(j++) << 16 |
                    bin.charCodeAt(j++) << 24;
            }

            let tailLength = len & 3;

            while( tailLength-- ) {
                a8[ j ] = bin.charCodeAt(j++);
            }

            callback( new Blob( [a8], {'type': type || 'image/png'} ) );
        }
    });
}

(您可能需要在与ECMAScript不太相关的浏览器中将constlet替换为var