H5页面生成长图实践总结

最近这一两年,长图分享突然悄无声息的兴起了。刚在产品上增加了这一功能,发现确实是一种极好的分享传播方式。
生成的效果图太长,下拉在文末可以查看到

结合之前的调研,以及尝试走不通的路,以下整理了这个功能点相关的方案,希望提供你有用的参考。

一、通过合成海报图来分享(APP, H5通用)。
典型的有极客时间APP留言分享,新浪微博客户端微博正文分享。


这类分享图的特点是
0、模板化、格式固定
1、结构简单,上下结构或左右结构
2、一般在端上实现,不事先保存图片
3、图上半部分是图文,底部是二维码

一个APP上的参考例子点击查看

二、通过截屏来实现。
现有成熟的方案是html2canvas

文档:点击查看
实例: 点击查看
Demo: 点击查看

一开始暂定用这种方案,后来验证的时候,发现使用CSS3的一些特性,导致截图后会有很多区域空白,可查看文末截屏生成的问题图片,于是才有了第三种方案。

其他开发者反馈的问题
0、跨域
1、图片模糊
2、图片尺寸跟随手机,大小不固定。【看产品能不能接受】
3、底部需要增加二维码【可以做一个二维码隐藏域,之后在拼接上】

三、通过绘图来实现。
通过JS的canvas来绘图

算法
0、页面点击生成长图按钮。
1、获取页面数据和DOM节点绘图,然后异步请求后端获取二维码接口, 把二维码(base64格式编码的图片)也绘进去。
2、canvas绘好图后一般是base64格式的图片信息。
3、请求接口上传到图床,返回图片地址。【这里H5页面潜入在客户端中,客户端目前只支持通过图片路径获取图片,这样也导致保存图片需要好几秒】
4、通过JSBridge通过图片地址下载图片,然后保存到本地相册。

遇到的问题
0、页面结构复杂的话,绘图工作量比较大,细节逻辑都需要兼容。【合作的前端真是厉害】
1、图片跨域。
2、绘图的时候如果有一张图片获取失败,绘图过程canvas就不会进入回调函数,记得加异常捕获。
3、上线后发现有些客户端保存图片不稳定,有时候失败。原因是获取页面上的图片存在跨域问题,按照下午添加了一个字符串,发现偶现保存失败的问题,后通过加时间戳解决。

【原谅我没找到图片上文章的原文】

开始认为后端合成更简单,可以缓存,后来发现结构复杂的html页面根本无法合成
有用php把html转为pdf,在转为pic的例子
还有使用GD库的例子

以上两种用PHP生成的方式可行性都不高。

文章开头提到的效果图:(几乎跟原页面高度一致)。

通过html2canvas截屏生成的问题图片:

发表评论

电子邮件地址不会被公开。 必填项已用*标注