w***@126.com
w***@126.com
  • 发布:2020-07-14 15:35
  • 更新:2022-01-14 15:30
  • 阅读:1990

【报Bug】canvas在iOS上使用canvasToTempFilePath导出图片是空白的。

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Mac

PC开发环境操作系统版本号: 10.15.2

HBuilderX类型: 正式

HBuilderX版本号: 2.7.14

手机系统: iOS

手机系统版本号: iOS 13.4

手机厂商: 苹果

手机机型: iphone8、iPhoneXR

页面类型: vue

打包方式: 云端

项目创建方式: HBuilderX

示例代码:

标签:

<canvas id="myCanvas" type="2d" canvas-id="myCanvas" style="background-color: #7bb1f4;width: 750rpx;"></canvas>  
<image :src="testImgUrl" mode="aspectFill" style="width: 100%; height: 100px"></image>

方法:

drawCanvas() {  

                               this.ctx = uni.createCanvasContext('myCanvas')  
                // begin path  
                this.ctx.rect(10, 10, 100, 30)  
                this.ctx.setFillStyle('yellow')  
                this.ctx.fill()  

                // begin another path  
                this.ctx.beginPath()  
                this.ctx.rect(10, 40, 100, 30)  

                // only fill this rect, not in current path  
                this.ctx.setFillStyle('blue')  
                this.ctx.fillRect(10, 70, 100, 30)  

                this.ctx.rect(10, 100, 100, 30)  

                // it will fill current path  
                this.ctx.setFillStyle('red')  
                this.ctx.fill();  
                // this.ctx.draw();  

                this.ctx.draw(false, res => {  
                    console.log('绘制成功', res)  
                    setTimeout( () => {  
                        uni.canvasToTempFilePath({  
                            x: 0,  
                            y: 0,  
                            width: 375,  
                            height: uni.upx2px(1020),  
                            // destWidth: 375,  
                            fileType: 'jpg' , // 'png'  
                            // destHeight: uni.upx2px(1020),  
                            canvasId: 'myCanvas',  
                            success: (res) => {  
                                console.log('canvasToTempFilePath', res)  
                                this.testImgUrl = res.tempFilePath;  
                                const imgurl = res.tempFilePath;  
                                var that = this;  

                                uni.saveImageToPhotosAlbum({  
                                    filePath:res.tempFilePath,  
                                    success: function(res2) {  
                                        console.log('saveImageToPhotosAlbum success', res2)  
                                        console.log('save success',res2);  
                                        uni.showToast({  
                                            title:'保存成功',  
                                            icon: 'none'  
                                        })  
                                    },  
                                    fail(res) {  
                                        console.log('保存失败', res)  
                                    }  
                                });  
                            },  
                            fail(e) {  
                                console.log(e);  
                                uni.showToast({  
                                    title: '生成图片失败',  
                                    icon: 'none'  
                                });  
                            },  
                            complete(res) {  
                                console.log('canvasToTempFilePath结束', res)  
                            }  
                        }, this)  

                    },5000)  

                },this)  
}

操作步骤:

看代码

预期结果:

iOS能够正常导出图片。

实际结果:

iOS导出图片异常。

bug描述:

使用canvas绘制,在使用canvasToTempFilePath导出图片,fileType参数为'jpg',在iOS上导出的是张空白的图片,fileType参数为'png',iOS上导出的是张透明的图片,在安卓上两种类型导出来的都是正常的。附件为fileType参数为'jpg'的情况,上面的黑框区域为正常的canvas绘制效果,下边的黑框区域是image标签使用canvasToTempFilePath导出canvas图片的地址附上去的(空白)。

2020-07-14 15:35 负责人:无 分享
已邀请:
w***@126.com

w***@126.com (作者) - 前端小白菜

急急急

  • 1***@qq.com

    请问解决了吗,我也碰到了这个问题

    2020-12-02 11:27

Meaty

Meaty - 95IT

我的也是空白的

大肥光光

大肥光光

从hbuildx2.6.16 切换到hbuildx2.9.8 ios 机子上导出就空白,换回2.6.16的话打包就会提示使用本地网络不给上架。我真是,绞死程序员的框架啊,前后退不得。

  • chenli

    建议按报bug模块新建个贴,提供个可复现简单工程示例,方便他人排查问题!

    2020-11-17 09:48

  • 大肥光光

    回复 chenli: 不需要提供示例,直接在canvas上的内容 使用 uni.canvasToTempFilePath 在ios真机或者云打包出来就能重现,hbuildx2.6.16 能导出 更新到2.9.8导出的图片就是空白的。这么简单实现需要什么示例?说的这么清楚了。你们没重现吗?

    2020-11-17 09:56

  • chenli

    回复 大肥光光: 在此是非官方人员,举手之劳给个建议而已。首先自己遇到问题要先从示例上自查问题,如果还是复现不了,再添加一些你业务此功能上的代码再自查是否可复现。。。。

    2020-11-17 10:20

取舍

取舍 - 我们都如流星短暂 但谁能像它闪耀

可以试下 控制canvas大小 不要超过 700 然后 在uni.canvasToTempFilePath 试试

  • 大肥光光

    指的是 width 和 height 不要超过700px吗?

    2020-11-17 10:48

  • 取舍

    回复 大肥光光: 嗯 因为 ios 他的浏览器 有限制canvas 的大小的, 所以canvas的大小不要太大, 目前的话 我只知道有这个问题

    2020-11-17 10:53

  • 大肥光光

    回复 取舍: 通过,一步步测试发现,除了canvas大小影响外,在canvas容器上增加样式如:border:1px solid #eee;也会导致导出图片空白。去掉就可。

    2020-11-25 11:43

静静123

静静123

请问问题解决了么,遇到同样的问题了,我导出的图片要么是空白,要么是黑屏,真机上有问题,编辑器上是可以用的

w***@126.com

w***@126.com (作者) - 前端小白菜

放弃了,通过renderjs使用html2canvas插件的方式实现了。

有问

有问 - 生活,趣与失。

解决了吗。。也是IOS获取空白。

该问题目前已经被锁定, 无法添加新回复