hero_ho
hero_ho
  • 发布:2019-06-02 00:30
  • 更新:2024-03-20 10:45
  • 阅读:6157

uni.canvasToTempFilePath 图片部分机型会出现空白

分类:uni-app

调用uni.canvasToTempFilePath截取图片的时候,输出生成的图片是正常的,输出在页面也 可以正常显示。但是上传给服务器后,当服务器返回该图片确实空白的。 这种情况只在一部分机型的h5端出现,一部分机型正常。出现这种情况的机型的app端也是正常显示的,没有任何问题。只是h5出了问题。

下面是代码:(代码应该是没有问题的,因为一部分机型完成是正常的)

ctx.draw(true, () => {  
                    // 获取画布要裁剪的位置和宽度   均为百分比 * 画布中图片的宽度    保证了在微信小程序中裁剪的图片模糊  位置不对的问题 canvasT = (_this.cutT / _this.cropperH) * (_this.imageH / pixelRatio)  
                    var canvasW = ((_this.cropperW - _this.cutL - _this.cutR) / _this.cropperW) * IMG_REAL_W;  
                    var canvasH = ((_this.cropperH - _this.cutT - _this.cutB) / _this.cropperH) * IMG_REAL_H;  
                    var canvasL = (_this.cutL / _this.cropperW) * IMG_REAL_W;  
                    var canvasT = (_this.cutT / _this.cropperH) * IMG_REAL_H;  
                    uni.canvasToTempFilePath({  
                        x: canvasL,  
                        y: canvasT,  
                        width: canvasW,  
                        height: canvasH,  
                        destWidth: canvasW,  
                        destHeight: canvasH,  
                        quality: 0.5,  
                        canvasId: 'myCanvas',  
                        success: function (res) {  
                            uni.hideLoading();  
                            // 成功获得地址的地方  
                            let tempFacePath = res.tempFilePath;  
                            // 截取到新的像以后,就进行上传                             
                            uni.showLoading({  
                                mask: true,  
                                title: '上传中...'  
                            });  

                            uni.uploadFile({  
                                url: config.serverUrl + '/user/uploadFace?userId=' + _this.globalUser.id + '&qq=' + config.qq,  
                                filePath: tempFacePath,  
                                name: 'file',  
                                header: {  
                                    headerUserId: _this.globalUser.id,  
                                    headerUserToken: _this.globalUser.userUniqueToken,  
                                    withCredentials: true   
                                },  
                                success:(res) => {  
                                    let resData = JSON.parse(res.data);  
                                    if (resData.status == 200) {  
                                        // 获得最新的用户数据  
                                        var userInfo = resData.data;  
                                        uni.setStorageSync('globalUser', userInfo);  
                                        uni.hideLoading();  
                                        uni.redirectTo({  
                                            url: '../settings/settings'  
                                        });  
                                        uni.navigateBack({  
                                            delta: 1  
                                        });  

                                    } else if (resData.status == 502 || resData.status == 500) {  
                                        uni.hideLoading();  
                                        uni.showModal({  
                                            title: '提示',  
                                            content: '当前是异地登录,请重新登录',  
                                            showCancel: false,  
                                            success: (res) => {  
                                                if(res.confirm){  
                                                    post('/user/logout',{userId: _this.globalUser.id}).then((res) => {  
                                                        if(res.status == 200){  
                                                            uni.removeStorageSync("globalUser");  
                                                            uni.reLaunch({  
                                                                url: '../registerLogin/registerLogin?showToHome=true'  
                                                            });  
                                                        }  
                                                    });                                   
                                                }  
                                            },  
                                            fail: () => {  
                                                uni.removeStorageSync("globalUser");  
                                                uni.reLaunch({  
                                                    url: '../registerLogin/registerLogin?showToHome=true'  
                                                });  
                                            }  
                                        })  
                                    }else{  
                                        uni.hideLoading();  
                                        uni.showToast({  
                                            title: resData.msg,  
                                            icon: 'none',  
                                            image: '/static/icos/error.png',  
                                            duration: 3000  
                                        });  
                                    }  
                                },  
                                fail: (res) => {  
                                    uni.hideLoading();  
                                    // uni.showToast({  
                                    //  title: '上传失败',  
                                    //  image: '/static/icos/error.png',  
                                    //  duration: 3000  
                                    // });  
                                    uni.showModal({  
                                        title: '上传失败',  
                                        content: res.errMsg,  
                                        showCancel: false  
                                    });  
                                }  
                            });  

                        }  
                    });  
                });
2019-06-02 00:30 负责人:无 分享
已邀请:
DCloud_UNI_GSQ

DCloud_UNI_GSQ

列出问题机型和使用的浏览器信息

  • hero_ho (作者)

    ipad-mini

    2019-06-05 11:48

  • 武哥

    我也遇到这个问题,怎么样 问题解决了吗

    2019-07-23 09:18

chenguokai

chenguokai

在测试时候,开发者工具和真机调试,微信小程序,还是显示空白啊

有问

有问 - 生活,趣与失。

解决了吗?两年了。。。IOS真要上还是会空白。。。子组件生成的canvas,咋都获取不到数据

  • DCloud_UNI_GSQ

    能否详细描述一下

    2022-01-14 19:46

  • 有问

    回复 DCloud_UNI_GSQ: 手机是ip6s 系统IOS12,HBX是最新A版,在IOS APP上,创建宽800高1100的CANVAS,所有画的本地图片和网络图片共三张加一些文字都成功了。到了后后一步,draw(true,这里),使用uni.canvastotempfilepath时取出的图片是空白,取不到canvas里正确的图片。而且draw里的回调无效,如果用draw(true,settimeout()...延迟回调有效,但是IOS会提示:

    canvasToTempFilePath:fail securityerror:the operation is insecure.翻译为什么不安全。。。而且是概率出现非常高,出现后依然无法获取画好的图片。

    2022-01-14 21:00

  • DCloud_UNI_GSQ

    回复 有问: 绘制的图像分别是哪个?

    2022-01-15 11:03

  • 风云酷小子

    就是啊,几年了,还没解决啊~~~

    2022-01-16 21:34

  • 有问

    回复 DCloud_UNI_GSQ: 一个本地logo.png,一个网络图片.jpg,还有一个JS生成的二维码图片。有人说是大小不能超过800,我改了一下也不管用。我把网络图片JPG下到到本地也不行。我觉得应该是部分机型和系统出现这个问题。但我手上只有IP6S 12.2系统,没办法测试别的。

    2022-01-16 21:53

风云酷小子

风云酷小子 - 苦逼的全栈

确实还有问题,请官方人员自行测试:

在ios的QQ和tim中,uni.canvasToTempFilePath 生成的图片是空白(空白是指连尺寸都没有)

但在ios的微信中,又正常。

附件1,是在微信中,正常的;

附件2,是在ios的QQ中,就是空白。

麻烦官方人员测试一下,急需解决。

  • 有问

    我的空白是一整张空白图。。。

    2022-01-16 21:54

  • 风云酷小子

    回复 有问: 我正在排查,好像直接引用又没问题,是uniCloud.uploadFile上传的问题,我还在排查中

    2022-01-16 22:08

  • 有问

    回复 风云酷小子: 我根本没有用到上传,就是画了3张图片加了一点文字。安卓都是正常的。

    2022-01-16 22:13

  • DCloud_UNI_GSQ

    具体说下测试步骤

    2022-01-17 11:16

q***@163.com

q***@163.com

有办法解决嘛 我搞一下午了!!

哈哈哈yo

哈哈哈yo - 哈哈哈

唉,一个一个入坑来,就是不见官网人员

全栈OkLin

全栈OkLin - android、ios、web、小程序、uniapp、python、php。。。。。。

巨坑啊,3年了都没解决,还是空白图

9***@qq.com

9***@qq.com

醉了 我还以为我代码写的有问题,排查了两天了,来一搜才发现不止我一个人

  • DCloud_UNI_GSQ

    能否具体说下测试步骤

    2022-09-13 11:50

  • y***@sina.com

    回复 DCloud_UNI_GSQ: ios真机白屏问题还没有解决吗,安卓机导出的图片显示正常,但是ios显示的就是白屏

    2022-11-12 14:15

  • DCloud_UNI_GSQ

    回复 y***@sina.com: 能否具体说下测试步骤

    2022-11-14 15:34

  • luojl

    回复 DCloud_UNI_GSQ: 使用图片大小为674KB,尺寸1224X2208时 uni.canvasToTempFilePath返回成功数据为{"errMsg":"canvasToTempFilePath:ok","tempFilePath":"data:,"},就是data是空的,

    当使用小点的图如大小为153KB,尺寸508x761时 data有图片数据。

    2022-11-30 17:57

  • luojl

    回复 luojl: 这是bug吗?急啊

    2022-11-30 17:58

  • luojl

    回复 luojl: 在h5下iOS真机上出现的

    2022-11-30 17:58

  • 很硕大无比的

    回复 luojl: 你好 问题解决了吗 我被这个bug卡了

    2024-03-20 10:42

门门

门门

有办法解决了吗?uni.canvasToTempFilePath方法写在.draw的回调里面,和需要setTimeOut,都使用了,开发这里一直没复现问题,用户端多次出现ios出现评率较高。

加勒比路飞

加勒比路飞

ios15.7系统 canvas h5正常生成,ios生成出来白屏,安卓正常显示

  • DCloud_UNI_GSQ

    使用Safari远程调试看一下,大概率能看到一个跨域相关报错

    2023-03-22 18:01

  • 加勒比路飞

    回复 DCloud_UNI_GSQ: 苹果12 系统为15.5 canvas 在app保存图片报错

    "errMsg": "saveImageToPhotosAlbum:fail [Gallery:-1]未能完成操作。(PHPhotosErrorDomain错误-1。),",

    "errCode": -100,

    "code": -100


    在苹果11 上面正常保存 小程序正常 H5正常

    2023-05-06 17:31

999

999

一样遇到了,求解决办法

余心何忍

余心何忍 - 哈哈哈

一样,h5端ios,求解决办法

1***@163.com

1***@163.com

你们试试 指定的宽高-1

ctx.draw(true, () => {    

        uni.canvasToTempFilePath({    
            canvasId: id,    
            width: width-1,    
            height: height-1,    
            success: (cRes) => {    
                let canvasUrl=cRes.tempFilePath;    
                resolve(canvasUrl);    
            },    
            fail: () => {    
                uni.hideLoading();    
                reject();    
            }    
        })    

});

看这样是不是就解决ios生成白屏的问题,我是发现白图比我canvas的宽高要大一点点

  • 1***@qq.com

    兄弟你试了吗?能解决问题吗?

    2023-08-04 14:32

  • 9***@qq.com

    我也遇到了这个问题,我感觉是宽度的问题,我只在苹果13和14上有问题,其他都是正常的

    2023-08-29 11:02

  • m***@163.com

    回复 9***@qq.com: 哥们你最后解决了吗,我也遇到了,就苹果14以上不行

    2023-10-13 11:20

  • 很硕大无比的

    回复 m***@163.com: 解决了吗

    2024-03-20 10:44

1***@qq.com

1***@qq.com

安卓端 通过canvas.drawImage()将要拼接的图片绘制在canvas上,然后在canvas.draw的回调中使用uni.canvasToTempFilePath来生成临时路径,但是生成出来的图片是空的。即使是在回调函数内增加setTimeout来延时也不行,这是怎么回事?uni.createCanvasContext的第二个参数加了this

很硕大无比的

很硕大无比的

解决了吗

要回复问题请先登录注册