uniapp移动端生成分享海报并下载的实现及遇到的坑uniapp移动端使用html2canvas实现自定义海报生成以及下

这是一个很普通的需求,但是没想到让我遇到了一个大坑(后面细说),卡了我整整一天的进度。

一开始想着用HBX的海报插件来实现,然后发现这些海报插件,要么是不适配vue3,要么是可定制性不够高,只能按照它写好的模板进行替换,再或者就是要去其他网站用在线海报编辑器编辑好了之后,再生成配置文件,有点麻烦。简单的说就是,要么用不了,要么不好用。

于是便想着通过html2canvas来自己实现。

新建一个组件.vue文件,然后在里面搭建页面结构,引入几张图片,得到下图。

页面结构如下:

npmihtml2canvas--save因为html2canvas要操作DOM元素,因此这里我们要用到renderjs,根据uni官方文档的说明,我们在文件中新增一对script标签,如下:

此时我们组件中存在两个script标签,如下:

除此之外,renderjs还有挺多注意事项的,建议大家遇到问题了先去官方文档中查看这些注意事项,比如说:

我们在视图层引入html2canvas,然后在其methods属性中定义一个toImage异步方法,该方法代码如下:

asynctoImage(){ try{ consttimeout=setTimeout(async()=>{ consthtmlCanvas=document.getElementById('htmlCanvas') constcanvas=awaithtml2canvas(htmlCanvas,{ backgroundColor:null, allowTaint:true, useCORS:true }) constbase64Data=canvas.toDataURL('image/png') this.$ownerInstance.callMethod('creates',base64Data) clearTimeout(timeout) },500); }catch(e){ console.log(e); }}图片跨域toImage的定时器一定要加上的,不然的话会有问题,然后就是获取DOM,使用html2canvas,然后通过toDataURL获取图片的base64数据,一切都好像很顺利,直到我运行的时候,控制台出现这行红字:

Uncaught(inpromise)SecurityError:Failedtoexecute'toDataURL'on'HTMLCanvasElement':Taintedcanvasesmaynotbeexported.atapp-renderjs.js:7906简单的说,就是canvas引入的图片跨域了,导致画布被污染,所以不能使用toDataURL这个方法导出数据了,于是我赶紧查看html2canvas的文档,发现有两个配置项与这个有关:

我将这俩配置项都设为true之后,再运行,哦豁,还是同样的错误。

赶紧上网咨询广大网友,得到的方法是:

首先第一个方法,不是很ok,因为后端比较忙,而且就3张图片,我也实在是懒得叫。然后第二个方法,好像可以,但是又瞬间清醒,我用的是image标签,不是img标签,在移动端使用img标签会不显示图片的,最后抱着希望跑去uni官网看看image标签会不会有这个属性:

很可惜,没有。

难道真的要去麻烦后端了吗!不不不,要不咋说网友是万能的呢,翻了十几页搜索结果之后,终于在一篇帖子中找到了,这位仁兄也遇到了同样的困境,canvas跨域,然后没有后端帮忙,他给出的解决方案如下:

二话不说,我直接就跑去把用到的图片转成了base64,然后封装成组件:

然后重写改写模板结构:

这个方法的逻辑很简单,将base64数据转换成tempFilePath,然后调用uni.saveImageToPhotosAlbum将图片保存到用户相册即可。

如何将base64数据转换成tempFilePath呢,网上教的都是转成blob,但是这在uniapp的移动端中不适用啊,网上搜不到,我就去插件库中抄一下,看看它们是怎么实现的,嘿,当我打开LimeEchart的目录的时候,很快就让我在一个utils.js文件中翻到了一个名为base64ToPath的工具函数,啥也不说,直接复制:

/***base64转filePath*@param{Object}base64*/exportfunctionbase64ToPath(base64){ returnnewPromise((resolve,reject)=>{ const[,format,bodyData]=/data:image\/(\w+);base64,(.*)/.exec(base64)||[]; constbitmap=newplus.nativeObj.Bitmap('bitmap'+Date.now()) bitmap.loadBase64Data(base64,()=>{ if(!format){ reject(newError('ERROR_BASE64SRC_PARSE')) } consttime=newDate().getTime(); constfilePath=`_doc/uniapp_temp/${time}.${format}` bitmap.save(filePath,{}, ()=>{ bitmap.clear() resolve(filePath) }, (error)=>{ bitmap.clear() console.error(`${JSON.stringify(error)}`) reject(error) }) },(error)=>{ bitmap.clear() console.error(`${JSON.stringify(error)}`) reject(error) }) })}然后就可以接着实现creates方法了:

creates(base64Data){ uni.showLoading({ title:'下载中', }) base64ToPath(base64Data).then(filePath=>{ uni.saveImageToPhotosAlbum({ filePath, success:()=>{ uni.hideLoading() uni.showToast({ title:'图片下载成功', mask:false, duration:1500 }); } }); })}到这里,基本上没有问题了,然后我就开了模拟器,进行了一波真机运行,确实很ok。

本次遇到最大的坑来了,上面是我在一个demo项目中实现的(编译快),然后我将其移动到正式项目中去。

于是乎,我给下载图片按钮绑定了一个逻辑层的方法,然后想这个方法中调用视图层的方法:

为了弄明白到底是什么原因导致的点击事件触发,我决定使用排除法。

首先我直接把demo项目中的这个功能直接整个复制到了正式项目中去(覆盖掉该模块的其他代码),然后运行,发现是可以下载图片的,也就是说,功能确实是没有问题的。

然后我开始恢复页面样式(既然功能没问题,那我把页面也恢复,那这个需求不就解决了吗),恢复的过程中,我发现猫腻了,因为这个项目中很多地方都用到了天空和海平面作为背景图,然后这俩还是分开的,于是我之前封装了一个页面容器组件pageContainer,然后这个组件的插槽部分就是页面内容了,这样就不用我每个页面都重新写背景了。

当我使用pageContainer包裹页面内容的时候,视图层的方法就无法被触发。

又换回了html2canvas,结果又卡在了视图层事件不触发这上面,关键是,它不报错,点击之后啥反应都没有,人家逻辑层起码还抛一个notafunction出来,然后文档中没有提到过这个(可能是那句只支持内联?),社区中也没有,网上还找不到。

THE END
1.字体app哪个好?手机字体软件下载字体app软件字体app大全是专为手机用户们打造的手机字体转换神器,这里收集了全网最齐全、转热门、最专业的手机字体软件,其中包括用户们最爱的字体管家、字体大师、爱字体、字体控、方正字酷等众多app,拥有几万种风格不同的字体,支持大部分手机一键更换,操作简单方便流畅,更拥有一键下载、断点续传、一键更换、备份等功能,需要的http://www.downcc.com/k/zitiapp/
2.文字图片制作器下载文字图片制作器安卓版下载大小: 47.83MB 语言: 中文 环境: Android 类型: 拍照摄影 版本: v4.1.2 更新: 2024-12-18 11:36:16 软件介绍 文字图片制作器APP简介 文字图片制作器是一款非常不错的手机图文制作软件,里面有很多图文制作素材,用户可以轻松制作封面、海报、文字图片等内容,非常方便。此外,软件还支持图片加文字,可自https://www.xunshei.com/azrj/308720.html
3.艺术字自动生成app生成字体分类发现字体艺术字自动生成app 标签: 生成 最后更新: 2024-12-05 共 5个字体 简介: 艺术字自动生成app Nutgame Regular语言:英文 下载 Darksoul语言:英文 下载 Molard Three语言:英文 下载 September Rain语言:英文 下载 Light Up Bold语言:英文 下载http://www.qiuziti.com/fontlist2?id=1042758
4.3D艺术字生成PNG的软件下载app3D艺术字生成PNG的软件 3D艺术字生成PNG的软件大全分享给大家,在这里可以帮助自己把3D艺术字自动生成为图片内容,在这里玩起来简单,并且很多模式可以自己选择,记得来007本栏目下载3D艺术字生成PNG的软件! 点击查看 3D艺术字生成PNG的软件AI工具管家最新版本v1.0.0 官方正版拍照美化 / 15.3M / 2023-04-18 下载 http://m.yx007.com/k/lbml/
5.Word2010提供的“艺术字”可生成任意尺寸配有阴影旋转弯曲刷刷题APP(shuashuati.com)是专业的大学生刷题搜题拍题答疑工具,刷刷题提供Word 2010提供的“艺术字”可生成任意尺寸、配有阴影、旋转、弯曲效果的文本。A.正确B.错误的答案解析,刷刷题为用户提供专业的考试题库练习。一分钟将考试题Word文档/Excel文档/PDF文档转化为在线https://www.shuashuati.com/ti/ce0b951928c8407a86cf6d9944178080.html?fm=bd25b87643cb492add3a4f788ca48d55b4
6.免费设计签名的手机软件大全概要:签名字体最新官方版是一款适用于各类商务办公人士的手机签名软件。签名、艺术签名、大师签名、个性签名、卡通签名、QQ签名、一句话签名、中英文签名……多种字体海量签名尽在这里。都说见字如面,一个好的签名能无形中提升您的个人形象。 手写签名设计 https://www.cl0579.com/ztsoft/mfsjqm/
7.有哪些艺术字生成软件APP推荐有哪些艺术字生成软件下载有哪些艺术字生成软件2022 艺术字生成软件有什么 06-22 照片生成3d人脸软件app有哪些2022 照片生成3d人脸的软件排行榜 今天小编将要介绍的是照片生成3d人脸软件app有哪些2022,随着互联网的不断发展,智能手机所能完成的事情也越来越多了,可以将照片生成3d的人脸,在之前这是不敢想象的事情,而在现如今可以实现了,接下https://www.wandoujia.com/bangdan/405953/
8.Unity自动化游戏框架通用自动化游戏框架爽到起飞的工作流巨幅作者提出并实现了一个工具,该工具自动扫描项目中的程序集,生成link.xml文件,帮助开发者更有效地管理和优化代码裁剪,同时考虑了热更新项目的灵活性需求。工具提供UI界面,允许开发者直观地选择要保留的程序集,并一键保存到link.xml中。 https://blog.csdn.net/final5788/article/details/126451377图片艺术字生成工具:https://blog.csdn.net/final5788/article/details/138164034
9.信息技术应用能力提升工程2.0工具软件集锦在电脑上语音快速转文字,在手机上(APP)实现语音快速转文字,在手机上实现“随声译”。 天若OCR(电脑软件) 天若OCR是一款文字识别工具,直接图便能生成文字内容;具有对文本进行识别、编辑、朗读、翻译等等实用功能。 用电脑抠出PDF中的文字 用电脑快速抠出与翻怿网页中的英文 https://www.meipian.cn/3b1ahl50
10.雪地写字生成器app下载photofunia雪地写字生成器安卓版下载雪地写字生成器是一款模拟器软件,这里的模拟真的非常像,玩家可以在上面输入各种的文字,还能选择艺术字,最后点击生成你就会有一张非常逼真的在雪地上写字的图片,就像你正在雪地里一样。 游侠手游是大家雪地写字生成器下载的首要选择,里面还有其他丰富的游戏和软件资源让大家下载,大家下载雪地写字生成器app之后,可以分享给https://app.ali213.net/mip/android/498161.html
11.艺术签名生成大师app下载艺术签名生成大师最新版下载v17.9.21《艺术签名生成大师》软件介绍: 1.有一手漂亮的签名也能增强自身的文艺气息,让大家都能够对你刮目相看,有需要的用户赶快来定制专属的签名吧。 2.大家遇到喜欢的类型还可以收藏保存下来,反复的欣赏,了解的内容越多,自己的涵养也会有所提升。 3.用户还可以自定义的设置背景以及字体,颜色,艺术字,商务字,手写字通通https://www.juxia.com/sjwy/ruanjian-429601.html
12.图趣AI输入一段文字,比如“由新海诚绘画的一条美人鱼”,就可以强势模拟画作,各种风景、奇幻、艺术画、超现实、动物、建筑物、浪漫、写实、抽象风格画作等你来畅想制作,其实你也是艺术鬼才。 【AI艺术字】 张、王、李、赵,百家姓,用您的姓氏结合风景、人物生成惊艳的艺术字,还愁别人记不清您的贵姓吗?快来生成微信图片吧https://apps.apple.com/na/app/%E5%9B%BE%E8%B6%A3ai-%E6%99%BA%E8%83%BD%E5%9B%BE%E7%BB%98-%E8%AE%A9%E7%94%BB%E7%94%BB%E6%9B%B4%E7%AE%80%E5%8D%95/id6447418778
13.毛笔书法有哪些APP常用工具这里没法输入网址,你可以百度一下“第一字体网”,这是一个个书法字体在线转换器,不仅可以在线生成你说的楷书、行书、草书、隶书、篆书五大字体,还可以生成古代和近代各大书法名家的书法字体。转换后生成的字体图片可以分享到QQ空间、微博。具体信息你可以进去看一下它的详细介绍。 字体转换器网「艺术字在线生成」书法https://hao.gjw123.com/cygj/6199.html
14.签名设计app下载签名设计app哪款好用签名设计app,帮助您更好的表达自己的名字。 手机签名设计软件,提供了各式各样的签名样式,比如,花体签名、个性签名、连笔签名等等,并支持不同文字的签名,比如中文签名,英文签名等。 一个好的签名,给人更好印象,也是自己内在的变现,快来生成并练习一个自己喜欢的签名吧!点击查看 2024-01-08 18:27共https://m.qqtn.com/k/mtxzb
15.奖状在线制作奖状制作app 奖状快速生成器 手机做奖状的软件 除了"奖状在线制作"可能还喜欢 奖状证书图片制作_奖状证书模板在线设计 图怪兽为您精心挑选了奖状证书图片专题,您可以对奖状证书专题里面的图片进行在线拼图、在线排版、艺术字替换等在线图片处理。 老师奖状图片制作_老师奖状模板在线设计 表扬/排行榜,选择您喜欢的老师奖状https://818ps.com/shejiimg/26505-3.html
16.做艺术字的网站(艺术字制作app推荐)网站制作知识资讯字体管家是一款免费在线制作艺术字的工具。它提供了丰富多样的文字效果和字体选择,用户可以自由地调整自己所需的风格和大小。此外,在线生成后还可以直接下载或复制代码到自己的网页中使用。 2. 极简抠图 极简抠图是一款专业级别的在线抠图工具,同时也支持制作艺术字。它不仅可以对文字进行美化处理,还能对图片进行背景去除https://www.semjishu.com/8170.html
17.免费logo在线制作,logo设计,logo在线生成,字体logo设计,U钙网U钙网遵循标志logo设计理念的艺术规律,创造性地探求恰当的艺术表现形式和手法,使所设计的标志logo具有高度的整体美感、获得最佳视觉效果。 最新原创设计更多 免费LOGO设计案例 最新图标字母图标动物图标厨师美食房屋建筑植物图标龙凤神兽商标设计文字设计欧式花纹 https://www.uugai.com/
18.壹号娱乐app官网下载壹号娱乐最新版本下载作者: 涂涵忍 2024-12-19 06:54 经典的八零后的游戏有没有 2024人气较高的80背工游排行榜 作者: 马斐斐 2024-12-19 05:40 有哪些艺术字生成软件2022 艺术字生成软件有什么 作者: 李弘博 2024-12-19 05:39 猜一猜:企鹅在水中也能看到明晰的图画吗 作者: 蔡婷美 2024-12-19 04:59 http://wap.uaoj.jmgrkj.com/
19.90秒看看传说中的英文圆体花体艺术字Happ来自好玩字体90秒看看传说中的“英文圆体花体艺术字”Happy New Year的书写快速全过程, http://t.cn/RxUs7j7 http://t.cn/RTRazm0 https://weibo.com/6402844346/G74c9jVOQ
20.渲图App排行榜OPPO手机渲图app推荐智能的水印模版:地点、时间、分贝、海拔,智能水印自动添加到照片上 【拼图大师】集海报拼图、水印模板滤镜贴纸、花体字于一身的全能图片编辑工具。智能多图拼接,一键生成超百款精美拼图海报模版,搭配萌趣贴纸奶酪字体和光效滤镜,轻松拼图,享受编辑图片的快捷和乐趣。可爱清新的贴纸:像素风、手绘风、图形、Emoji等图形http://vip.diandian.com/phb/1942/5-1.html