uniapp中canvas绘制图片内容空白报错的原因及解决

 更新时间:2023年09月17日 10:26:05   作者:痴心阿文  
最近有个需求就是要用canvas画个分享的海报,所以这里总结下,这篇文章主要给大家介绍了关于uniapp中canvas绘制图片内容空白报错的原因及解决方法,需要的朋友可以参考下

问题图: 

效果图:

Canvas绘制图片流程

简单说一下canvas上绘制图片的过程

🧨先调用相机接口拍摄照片,

🧨把照片URL拿到,

🧨然后获取照片URL信息宽高,

🧨把宽高给画布,🧨使用canvas的drawImage API把图片绘制到canvas上,🧨绘制方法执行完成后把这个canvas导出为图片,并上传到服务器,至此流程结束。

首先定义画布canvas

<canvas class="canvas" canvas-id="canvas"
				:style="{ height: canvasHeight + 'px', width: canvasWidth + 'px'  }"></canvas>

1.画布的大小大于了图片的大小导致了生成的内容是空白的

canvas画布初始值没有,导致没有绘制成功

解决:

 //默认初始值   canvasWidth1  canvasHeight1
data() {
        return {
			ctx: null,
			canvasWidth: 1080,
			canvasHeight: 1440,
        }
    },

2.绘制图片没有放到wx.draw方法里面

wx.draw(false, () =>{
  wx.canvasToTempFilePath({
       x: 0,
       y: 0,
       canvasId: 'shareCanvas',  // shareCanvas 为制定 绘图canvas 的ID
       success: (res) => {
            this.storeImgPath = res.tempFilePath
            ....写入生成完成的逻辑
       },
      complete: (res) => {
           wx.hideLoading()
       }
  })
})

3.Failed to execute ‘toDataURL’ on ‘HTMLCanvasElement’: Tainted canvases may not be exported.

报错信息

 canvas无法执行toDataURL方法,受污染的画布无法输出

 受限于CORS 策略,会存在跨域问题,页面虽然可以使用跨域的图片(比如使用img标签或者append到页面上),因为浏览器本身不会有跨域问题,但是一旦绘制到canvas上就会污染这个canvas,导致无法提取到这个canvas的数据,也就无法输出了。

上面的都加了还存在,必杀技,延迟方法:

//万能代码,不能用你回来找我,能用可以双击点赞评论666	
console.log('正在绘制')
			this.ctx.draw(false,(()=> {
				setTimeout(() => {
				uni.canvasToTempFilePath({
					x: 0,
					y: 0,
					width: this.canvasWidth1,
					height: this.canvasHeight1,
					destWidth: this.canvasWidth1,
					destHeight: this.canvasHeight1,
					canvasId: 'myCanvas',quality:0.6,
					success: res => {
						// 在H5平台下,tempFilePath 为 base64
						console.log(res,'绘制完成===',)
						//上传
						uni.uploadFile({
							url: url, //仅为示例,非真实的接口地址
							filePath:res.tempFilePath,
							header: {
								'token': self.$store.state.token,"version":"100.0.00"
							},
							name: 'file',
							formData: {},
							success: (uploadFileRes) => {
								console.log('uploadFileRes===1111',uploadFileRes)
								uni.hideLoading()
							},
							fail(err) {
								console.log(err)
								uni.hideLoading()
							}
						});
					//	this.pictureArr.push(res.tempFilePath);
					},
					fail(err) {
						console.log(err)
						uni.showToast({
							title:'上传图片失败!',icon:'none',
							duration: 3000
						})
						uni.hideLoading()
					}
				}, this)
				}, 3500)
			})());

万能代码,不能用你回来找我

总结

到此这篇关于uniapp中canvas绘制图片内容空白报错的原因及解决的文章就介绍到这了,更多相关uniapp canvas绘制图片内容空白内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 自定义require函数让浏览器按需加载Js文件

    自定义require函数让浏览器按需加载Js文件

    可能很多人看到这个题目就会想到LABjs、RequireJS、SeaJS... 这些库,但无奈小编没用过这些库,什么 AMD 、CMD 哪来那么多术语... 前端的库太多了,要看各种乱七八糟的文档,好难啊,还不如自己写一个库呢。于是就有了这文章,有需要的朋友们下面来一起学习学习吧。
    2016-11-11
  • js实现弹框效果

    js实现弹框效果

    这篇文章主要为大家详细介绍了js实现弹框效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-03-03
  • Ajax高级笔记 JavaScript高级程序设计笔记

    Ajax高级笔记 JavaScript高级程序设计笔记

    这篇文章主要介绍了Ajax高级笔记 JavaScript高级程序设计笔记,需要的朋友可以参考下
    2017-06-06
  • 非主流的textarea自增长实现js代码

    非主流的textarea自增长实现js代码

    今天稍微研究了下textarea随输入内容自动增长的功能,通过google参考了一些实现方式
    2011-12-12
  • Bootstrap CSS组件之导航(nav)

    Bootstrap CSS组件之导航(nav)

    这篇文章主要为大家详细介绍了Bootstrap CSS组件之导航(nav),具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • js实现瀑布流的三种方式比较

    js实现瀑布流的三种方式比较

    瀑布流,又称瀑布流式布局,是比较流行的一种网站页面布局,这篇文章主要介绍了js实现瀑布流的三种方式,感兴趣的小伙伴们可以参考一下
    2015-12-12
  • JavaScript的六种继承方式(推荐)

    JavaScript的六种继承方式(推荐)

    继承是面向对象编程中又一非常重要的概念,JavaScript支持实现继承,不支持接口继承,实现继承主要依靠原型链来实现的
    2017-06-06
  • JS前后端实现身份证号验证代码解析

    JS前后端实现身份证号验证代码解析

    这篇文章主要介绍了JS前后端实现身份证号验证代码解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 菜单制作学习一个小东西

    菜单制作学习一个小东西

    菜单制作学习一个小东西...
    2006-09-09
  • TypeScript装饰器与反射元数据实例详解

    TypeScript装饰器与反射元数据实例详解

    TypeScript的装饰器为我们提供了一种强大的工具,可以在运行时改变类的行为,通过理解装饰器的工作原理,我们可以创造更加强大、灵活且易于维护的应用,这篇文章主要介绍了TypeScript装饰器与反射元数据,需要的朋友可以参考下
    2023-09-09

最新评论