uni-app uni.canvasToTempFilePath在h5端成功回调,安卓系统显示成功,ios端显示空白

uni-app uni.canvasToTempFilePath在h5端成功回调,安卓系统显示成功,ios端显示空白

示例代码:

const drawLine = () => {
let ctx = uni.createCanvasContext('wrapper', instance)
ctx.setLineWidth(1)
ctx.setStrokeStyle('#999')
ctx.moveTo(0, 0)
ctx.beginPath()
//循环坐标数组进行画线
props.coordinatesArr.forEach((item, i) => {
ctx.lineTo(props.coordinatesArr[i].x, props.coordinatesArr[i].y)
ctx.stroke()
})
ctx.closePath()
ctx.draw(false, function () {
uni.canvasToTempFilePath(
{
canvasId: 'wrapper',
quality: 1,
fileType: 'png',
success: function (res) {
console.log(res)
// 在H5平台下,tempFilePath 为 base64
//保存画布地址
let resUrl = res.tempFilePath
imgUrl.value = resUrl
console.log(resUrl)
},
fail(res) {
console.log(res)
tip = res
uni.showToast({
icon: 'error',
title: '画图失败'
})
}
},
instance
)
})
}

操作步骤:

canvas画图导出图片ios空白

预期结果:

iOS图片显示正常

实际结果:

ios端显示空白

bug描述:

h5端进入页面先用canvas画图,画完再调用uni.canvasToTempFilePath生成图片,图片生成后电脑谷歌浏览器上、微信开发者工具、安卓手机上显示正常,ios苹果手机显示空白,uni.canvasToTempFilePath成功回调的图片地址为:data:


更多关于uni-app uni.canvasToTempFilePath在h5端成功回调,安卓系统显示成功,ios端显示空白的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于uni-app uni.canvasToTempFilePath在h5端成功回调,安卓系统显示成功,ios端显示空白的实战教程也可以访问 https://www.itying.com/category-93-b0.html


在使用 uni.canvasToTempFilePath 将 canvas 内容导出为图片时,如果 H5 端和安卓端都能正常显示,但在 iOS 端出现空白的情况,可能是由于 iOS 系统的一些限制或兼容性问题导致的。以下是一些可能的原因和解决方法:

1. Canvas 内容未完全渲染

iOS 系统在执行 canvasToTempFilePath 时,可能 canvas 的内容还没有完全渲染完成。可以尝试在调用 canvasToTempFilePath 之前,先手动调用 ctx.draw() 确保内容已经渲染。

ctx.draw(false, () => {
    uni.canvasToTempFilePath({
        canvasId: 'myCanvas',
        success: (res) => {
            console.log('导出成功', res.tempFilePath);
        },
        fail: (err) => {
            console.log('导出失败', err);
        }
    });
});

2. Canvas 尺寸问题

iOS 系统对 canvas 的尺寸有一定限制,如果 canvas 的尺寸过大,可能会导致导出失败或空白。可以尝试减小 canvas 的尺寸,或者在导出时指定较小的尺寸。

uni.canvasToTempFilePath({
    canvasId: 'myCanvas',
    width: 300,  // 指定导出图片的宽度
    height: 300, // 指定导出图片的高度
    success: (res) => {
        console.log('导出成功', res.tempFilePath);
    },
    fail: (err) => {
        console.log('导出失败', err);
    }
});

3. 异步问题

如果在 canvas 上绘制的内容是异步加载的(例如图片),在调用 canvasToTempFilePath 时,可能图片还没有完全加载完成。可以确保所有资源都加载完成后再进行导出。

const img = new Image();
img.src = 'https://example.com/image.png';
img.onload = () => {
    ctx.drawImage(img, 0, 0);
    uni.canvasToTempFilePath({
        canvasId: 'myCanvas',
        success: (res) => {
            console.log('导出成功', res.tempFilePath);
        },
        fail: (err) => {
            console.log('导出失败', err);
        }
    });
};

4. iOS 系统限制

iOS 系统在某些情况下可能对 canvas 的导出有限制,尤其是在使用跨域图片时。如果 canvas 中包含跨域图片,可能会导致导出失败。可以尝试确保所有资源都是同源的,或者使用 crossOrigin 属性来处理跨域图片。

const img = new Image();
img.crossOrigin = 'anonymous';
img.src = 'https://example.com/image.png';
img.onload = () => {
    ctx.drawImage(img, 0, 0);
    uni.canvasToTempFilePath({
        canvasId: 'myCanvas',
        success: (res) => {
            console.log('导出成功', res.tempFilePath);
        },
        fail: (err) => {
            console.log('导出失败', err);
        }
    });
};

5. uni-app 版本问题

如果你使用的是较旧版本的 uni-app,可能存在一些已知的 bug。可以尝试升级到最新版本,看看问题是否得到解决。

npm update -g [@vue](/user/vue)/cli
npm update -g [@dcloudio](/user/dcloudio)/uni-cli

6. 调试和日志

如果以上方法都无法解决问题,可以在 iOS 端打印更多的调试信息,或者使用 uni.showModal 来显示错误信息,帮助定位问题。

uni.canvasToTempFilePath({
    canvasId: 'myCanvas',
    success: (res) => {
        console.log('导出成功', res.tempFilePath);
    },
    fail: (err) => {
        console.log('导出失败', err);
        uni.showModal({
            content: JSON.stringify(err),
            showCancel: false
        });
    }
});
回到顶部