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、历史版本应用下载资源,还有类似可以生成海报的的应用推荐,欢迎大家前来豌豆荚下载。https://www.wandoujia.com/bangdan/763918/
2.制作海报的软件app排行榜前十名偏玩手游盒子分享十大制作海报的软件app排行榜前十名手机应用,编辑为您推荐手机制作海报的软件app排行榜第一名到前5名到前十名的应用。找制作海报的软件app有哪些、制作海报的软件app哪个好用,上偏玩手游盒子https://m.pianwan.com/s/zj-1305178
3.5款超实用海报制作软件,零基础也能做海报别担心,今天我将为大家介绍几款实用的海报制作软件,即便是设计小白,也能轻松上手,创作出令人惊艳的作品。1、 海报设计室APP 海报设计室是一款手机端海报制作软件,拥有海量的模板库,涵盖各种场景,从节日庆祝到商业宣传,应有尽有。它的拖放界面友好直观,无需设计基础,也能快速制作海报。操作步骤:①打开 海报https://baijiahao.baidu.com/s?id=1818763282651435373&wfr=spider&for=pc
4.是否有一键生成海报的软件?海报制作app素材库中有几十万个海报的模板,大家也可以直接套入照片,然后将想要添加的文字和边框加入进去,这样一幅好看又简单的海报就生成了,操作特别省心。2、《稿定设计》专门为企业和个人设计而诞生的app,不管是给图片加水印,还是想要制作宣传图或海报,都能根据原有的板块来一键生成,傻瓜式操作让每个人都能快速上手。3、https://wap.zol.com.cn/ask/x_24946744.html
5.海报生成器海报自动生成app海报生成器【海报自动生成app】 想设计海报,但是又嫌ps制作太繁琐,推荐10个简单实用的在线平面设计网站,用过就离不开的那种!就算是小白,也能设计出精美时尚的海报。 01 创客贴 https://www.chuangkit.com/?dontjump=1 创客贴是一款多平台(Web、Mobile、Mac 、Windows)极简图形编辑和平面设计工具,包括创客贴网页https://www.wandongli.com/news_detail.html?id=20723
6.AppStore上的“PISPIS修图P图软件是一个简单易用、输出方便的图形处理制作app,可以进行老照片修复、翻新、美颜、黑白、滤镜、相框装裱等,使你成为朋友圈中的相片修图大师!你可以选择手机上的任意图片、照片来制作文字艺术海报、拼图、画中画照片、照片书、gif和动态视频、个性头像、聊天表情包,简单快捷地发布到微信朋友圈、iMessage、微博https://itunes.apple.com/cn/app/id897430250
7.腾讯视频app怎么生成台词海报并分享?手机软件软件教程腾讯视频app中想要将电视的台词生成海报并飞翔给出去,该怎么办呢?下面我们就来看看详细的教程,需要的朋友可以参考下 GPT4.0+Midjourney绘画+国内大模型 会员永久免费使用! 【如果你想靠AI翻身,你先需要一个靠谱的工具!】 看视频的时候发现台词还不错,想要生成台词海报并分享该怎么实现呢?下面我摩恩就来看看腾讯视频https://www.jb51.net/softjc/578773.html
8.招聘海报在线生成图怪兽招聘海报在线生成专题为您精选招聘海报在线生成模板,包含招聘海报在线生成的图片素材等可根据您的需求选择,不同图片尺寸进行在线替换文字制作,即可一键生成一张正版可商用模板图片免费下载。https://818ps.com/shejiimg/52324-3.html
9.uniapp中使用html2canvas做H5端的海报生成功能这两天在做一个投票分享页的功能,产品上需要做一个生成海报的功能,说白了就是将一个弹窗页生成一张图片,供用户保存下载并且分享。原先找了好多插件,uniapp插件市场上一大堆,各种使用canvas绘制出一个海报的插件,层出不穷,感觉都挺复杂的,用起来也不是很方便,后来就想到了,能不能有一个工具,能把html转换为canvahttps://www.jianshu.com/p/790f7d891d51
10.小程序uniuniapp中使用html2canvas做H5端的海报生成功能 - 简书 uni-app 中使用 html2canvas 生成图片(支持多端)_uniapp html2canvas_不想搬砖。的博客-CSDN博客 uni-app APP、html引入html2canvas截图以及截长图_html2canvas npm-CSDN博客 uni-app 中使用 html2canvas 生成图片(支持多端)_uniapp html2canvas_不想搬https://blog.csdn.net/snowball_li/article/details/133801504
11.一键生成app制作器一键生成油画app?六、海报一键生成的app? 一键秀app 一键秀APP是一键生成宣传片的视频制作神器,能够快速生成企业宣传片,内含丰富多样的宣传模板,多面场景给你多种选择,10秒钟做企业宣传片,30秒做海报,5分钟完成宣传单!千名视频制作人员与平面设计师提供无限创意,海量模版每日更新,全品类多行业覆盖。让普通用户零基础在手机端快速制作https://tool.a5.cn/article/show/72817.html
12.海报制作免费软件下载可以制作海报的app推荐海报制作软件能够将用户的内心想法通过海报来展现出来,有制作海报需求的朋友们就会问海报制作软件有哪些哪个好用,于是小编就给大家提供了可以制作海报的app大全,其中就有图怪兽、美图秀秀、创客贴app等等,这些软件都可以为你提供海报制作功能,还有丰富的海报模版可以直接免费使用,海报一键生成功能等等,适用于微商海报、放https://www.ddooo.com/zt/haibaosheji.htm
13.MockuuupsStudio一键生成精美APP宣传海报图(600+手机电脑你只需把你的 APP 截图、网页、电脑软件界面截屏拖放到 Mockuuups Studio,就能将它们嵌入到各种手持样机场景的模版上,瞬间生成出专业精美的宣传展示海报图片,效果瞬间高大上!绝对是设计师、开发者和产品运营的必备工具。 你完全不必学习或动用复杂的PhotoShop、Sketch,就能做出让人羡慕的效果。生成的图片可用于宣传推广https://www.iplaysoft.com/mockuuups-studio.html
14.海报制作app哪个好手机免费设计制作海报软件有哪些水印相机p图海报app 2020-04-10 / 7.03MB 水印相机p图海报app是一款由湖南惠人网络科技有限公司发行的水印p图软件,专门为微商量身定做的一款海报设计应用。该软件中有海量的海报模板,可以适合各类应用场景。 抖画最新版 2020-03-09 / 25.47MB 抖画是一款由重庆古漫科技有限公司开发的漫画手绘头像定制软件。我们汇集上https://www.87g.com/zhuanji/1432.html
15.十大好用的海报制作软件海报设计用什么软件海报制作APP推荐设计海报的软件有很多种,有的需要从零开始设计,有的则可以选用模板进行创作。本文中Maigoo小编就带大家看看制作海报的软件有哪些。例如稿定设计、Canva可画、创客贴设计,以及图怪兽、美图秀秀、美图设计室、青柠设计、黄油相机、海报设计室等,都是当下较为热门的海报制作APP,下面来详细了解下。 排排榜 关注榜 点https://www.maigoo.com/top/442072.html
16.制作海报的app推荐,简单方便又快捷,一键满足的设计需求伴随着移动互联网技术的发展,现如今,越来越多的生产力工具,开始以app的形式进入到手机当中。以平面设计领域为例,现如今,制作海报的app早已是多如牛毛。就连传统技术大厂Adobe也开始逐步将Ps、Lr、Ai等专业设计软件,移植到移动端平台当中。https://www.canva.cn/learn/app-for-making-posters/
17.海报制作哪个软件好2024海报制作软件免费版海报制作哪个软件好?小编为大家带来实用的海报制作app,可以帮助用户完成海报制作的工作,还提供各种专业的制作功能,各种精美的海报模板可以使用,此外还能够自由拼接图片,一键生成长图海报,有需要的用户可以免费下载哦。0 共23款软件Logo设计大师 分类:系统工具时间:2024-10-09 Logo设计大师APP是能免费设计Logo的软件,https://www.doyo.cn/zhuanti/hbzz/
18.手机制作广告图片软件有哪些凌风制作海报软件免费是一款专门针对海报制作的工具,在这里拥有多样化的设计模板使用,可以轻松的创建出一个适合自己的主题海报内容,各种专业的创业工具供用户使用,带来多样化的个性海报使用。 点击下载 图纸通手机版 31.23M / 2024-07-12 / v8.2.1 官方安卓版 图纸通app免费版是一非常好用的手机看图软件,可以根据http://www.downcc.com/k/sjzzggtp/
19.美图设计室智能生成海报一键生成美图设计室是美图秀秀旗下的智能设计在线协作平台,是一款平面设计工具和在线平面设计软件,提供海量海报模板,跨境电商模板,跨境电商banner,跨境电商主图,邀请函,公告通知,喜报,logo等免费设计素材和模板,可在线智能生成海报,一键换色,一键换装,一键去水印,图片高清修复,无损https://design.meitu.com/
20.2024好用的手机海报制作软件排行榜前十名海报设计软件在线海报设计平台为广大企业、商家、自媒体、微商与个人提供海报设计制作功能服务,海报设计软件全新的海报创作功能,不需要任何设计基础,就可通过简单的文字图片替换,海报设计软件全行业模版任你用,快速完成设计,解救设计菜鸟,从此让创意轻松落地,快速生成一张高逼格的海报。想要自己也能做出这样高大上的海报吗https://www.liqucn.com/rj/tag/haibaozhizuo/hot/
21.图怪兽作图神器在线海报编辑器PS图片制作海报设计 在线设计更简单 微信/公众号 海量宣传模版挑选 小红书 运营模板应有尽有 电商 活动广告一键生成 政务媒体 实时热点更新 教育培训 课程栏目一目了然 人事行政 轻松应对工作需求 印刷物料 繁琐设计即刻搞定 ? 热点日历 冬至 2024.12.21 星期六 7天后 圣诞节 2024.12.25 星期三 11天后 世https://app.tuguaishou.com/