小程序canvasToTempFilePath调用报错create bitmap failed

wx.canvasToTempFilePath(OBJECT, this)
把当前画布指定区域的内容导出生成指定大小的图片,并返回文件路径。在自定义组件下,第二个参数传入组件实例this,以操作组件内 组件

现象:在性能不强的安卓机上,调用时会出现这一报错,本人的三星 S7 sdge和同事的小米MAX上都大概率出现。

解决办法: 延迟调用或者错误回调中进行处理。


延迟调用

这一报错在微信开发者论坛中被多次提及,最多被提到的就是这一方法。

wx.draw(false, () => {
    setTimeout(()=>{
        wx.canvasToTempFilePath();
    }, 200);
});

wx.draw()是一个异步执行的api,canvasToTempFilePath需要在其回调中执行。延迟200毫秒一般就可以解决这个问题。
当这个api只执行一次时延迟200毫秒其实无所谓,但是多次调用时,这个延迟也浪费了不少时间。对于性能强大的手机,这也是一种浪费,一般只有性能较弱的安卓机才会出现这个问题。所以我更建议大家使用下面一个。

错误回调处理

canvasToTempFilePath本身也是异步api,有错误回调可以使用。

let count = 0;
function getTempFile(otherOptions) {
    wx.canvasToTempFilePath({
        ...otherOptions,
        success: () => {},
        fail: (error) => {
            const { errMsg } = error;
            // 可能会有其他报错 还是拦截一下吧
            if ( errMsg === '具体报错' ) {
                // 一次不行再试一遍 两次都不过就放弃吧
                count += 1;
                if (count < 3) {
                    getTempFile(otherOptions);
                }
                else {
                    // 错了这么多遍基本没救了
                }
            }
            
        },
    });
}

我的项目中需要绘制的图片大小为180*180px,耗时基本在50-100ms左右。报错一次以后canvas基本也就准备好了,一般不会错第三遍。


题外话:这一个api的耗时与画布大小密切相关,也建议大家绘制图片时一定要控制好canvas画布大小。比方说,绘制200*200的图片,canvas要大小一致。尤其是图片数量比较大时,在模拟器上体现不出差别,但是手机上影响很大。

你可能感兴趣的:(小程序canvasToTempFilePath调用报错create bitmap failed)