H5分享截图方案优化(h5页面调用手机截图功能)
ztj100 2025-03-13 22:12 49 浏览 0 评论
背景
分享是传播活动,吸引用户最重要的一环。现有分享手段多是题目配合单张图片,利用点击的方式跳转到目标页面。在信息越来越丰富的今天,单个题目和图片对用户的吸引力是有限的。而在对推广要求更高的营销场景和裂变过程中,我们往往需要将页面内容一部分作为图片整体分享出去。直接利用手机原生的截屏功能会有几个问题:
内容格式无法自定义。
翻页情况无法处理。
视窗区域不可控。
本文通过讨论现有截屏的方案和闲鱼内部截屏方案,介绍如何利用web实现移动端高还原度富图文分享。
现有方案:Html2Canvas
介绍
html2canvas是一种基于canvas,将DOM结构绘制在canvas上面产生图片的第三方库。通过如下的方式可以将对应的DOM结构绘制成图片保存出来。优势在于上手简单,使用方便。
绘制原理
原理如下图所示。核心逻辑是克隆对应节点DOM结构,利用parse解析成数据,构建canvas进行内容绘制,返回对应的canvas。
实际使用中发现存在如下问题
图片跨域不支持。生成的图片存在跨域限制问题。
绘制清晰度低。即使使用api
scale
放大后绘制,又会由于生成base64格式图片内容过长导致无法传输。圆弧计算精度低。由于html2canvas是计算像素后绘制到canvas上,而canvas展示又会经过浏览器绘制,导致像素精度降低。
深度节点出现黑色情况。由于DOM结构过深,经过像素计算后,会偶尔出现像素丢失情况。
现有方案:SVG
介绍
该方案是利用svg可以包裹DOM结构的特性,将对应目标装载进去,之后将svg导出成base64格式的图片。使用方式如下。通过xmlns指定命名空间,防止多集合下元素和属性的冲突。后缀中的 svg
和xhtml
分别表示解析方式。利用不同的解析方式,实现了svg内部嵌入html的方式。
之后只要通过 encodeURIComponent(svg)
将对应的svg转换成base64就可以。优势是容易上手且不依赖第三方库。
实际使用中发现存在如下问题
SVG无法连接到外部的资源。比如通过cdn引入的css以及html中的图片连接都会被限制。
不支持js执行。现如今SPA页面都需要执行JS后才会渲染对应的DOM节点,而SVG却不支持JS的执行。
SVG位置和大小不确定。遇到需要及时展示的情况,需要实时计算位置才行。
解决方案
思路
从上面可以看到,现有的两种主流移动端截屏方案都有自己的不足。相比之下,利用canvas绘制的方法更适合SPA应用。那么我们需要解决的是html2canvas对应的几个问题:图片跨域,清晰度低,圆弧计算精度差,深层节点解析出错。
图片跨域
通过 newImage
的方式生成图片,在image.onload
阶段使用canvas绘制图片。此时会产生跨域限制,需要通过crossOrigin='Anonymous'
设置来解决这个问题。
提高清晰度
在绘制中发现,如果采用宽度375px的canvas将图片导出,会出现图片模糊的情况。一种方案是提高原图片清晰度,但是加载速度会大大提高,用户体验不友好。另一种方式是放大canvas,利用 drawImage
中的参数控制图片坐标和canvas中的绘制坐标。drawImage
中包含几个参数:控制图片的sx, sy, sWidth, sHeight和控制canvas绘制的x, y, width, height。参数具体含义如图中所示。
将方法中width和height乘上ratio,放大图片,控制绘制坐标,就能在canvas特定位置上绘制出想要的内容。考虑到小canvas在展示阶段清晰度足够,仅保存阶段需要放大三倍绘制的特性,采用第二种方法在几乎没有提高性能开销的前提下,提高清晰度。我们以实际绘制截图来看一下效果。下图左边是一倍结果,右图是三倍结果。
圆弧精度低和深层DOM解析
圆弧精度低和深层DOM解析出错问题本质上还是由于DOM结构过于复杂,当采用通用方案处理时,难免无法覆盖。考虑到移动端内容有限,结构简单的特点。决定采用特定DOM节点针对性绘制的方案解决深层DOM解析出错的问题。好处如下:1)方法原子化,维护简单。2)绘制高度自定义化,自由组织界面结构。3)拓展性强。在同事胖仔的帮助下实现特定DOM节点绘制方案。方案构建过程中主要有如下几个难点:圆角矩形,文字自动换行。
圆角矩形:通过截断的方式绘制特定背景的圆角矩形。原理是通过
createPattern
的方式在canvas上获取图片内容,再利用Path的方式,绘制对应的路线,利用canvas.arc
绘制圆弧部分,利用canvas.lineTo
绘制直线部分,截取想要的内容,实现圆角矩形。
图片内容获取。 context.createPattern(imgUrl,"no-repeat")
圆角矩形区域绘制
绘制内容
文本自动换行:思路是通过 measureText
获得当前文本宽度,每次添加一个字,比对此时文本宽度和行宽,超过时候绘制当前行,进行换行,y增加行高,重复这个过程。
效果
实现了一套移动端截屏方法。解决了现有第三方库html2canvas绘制清晰度低,圆弧计算精度低,深层DOM解析出错的问题。
采用原子化实现方法。支持截屏自定义绘制,而不是如html2canvas和svg只能通过复数次绘制不同DOM节点,来拼凑目标的方式。
总结
在互联网时代,尤其是5G马上要来临的今天。传统的分享模式,标题+单图片,逐渐难以满足越来越丰富的活动宣传要求。而流量的廉价化和短视频火热的时下,富图文传播无疑能传递更多的信息。目前我们已经实现了基本DOM节点绘制方案,并在站内活动中使用富图文分享。相信在不久的将来,我们能够利用移动端截屏分享功能帮助更多闲鱼用户高效率分享内容,让用户乐在闲鱼,玩在闲鱼。
相关推荐
- 30天学会Python编程:16. Python常用标准库使用教程
-
16.1collections模块16.1.1高级数据结构16.1.2示例...
- 强烈推荐!Python 这个宝藏库 re 正则匹配
-
Python的re模块(RegularExpression正则表达式)提供各种正则表达式的匹配操作。...
- Python爬虫中正则表达式的用法,只讲如何应用,不讲原理
-
Python爬虫:正则的用法(非原理)。大家好,这节课给大家讲正则的实际用法,不讲原理,通俗易懂的讲如何用正则抓取内容。·导入re库,这里是需要从html这段字符串中提取出中间的那几个文字。实例一个对...
- Python数据分析实战-正则提取文本的URL网址和邮箱(源码和效果)
-
实现功能:Python数据分析实战-利用正则表达式提取文本中的URL网址和邮箱...
- python爬虫教程之爬取当当网 Top 500 本五星好评书籍
-
我们使用requests和re来写一个爬虫作为一个爱看书的你(说的跟真的似的)怎么能发现好书呢?所以我们爬取当当网的前500本好五星评书籍怎么样?ok接下来就是学习python的正确姿...
- 深入理解re模块:Python中的正则表达式神器解析
-
在Python中,"re"是一个强大的模块,用于处理正则表达式(regularexpressions)。正则表达式是一种强大的文本模式匹配工具,用于在字符串中查找、替换或提取特定模式...
- 如何使用正则表达式和 Python 匹配不以模式开头的字符串
-
需要在Python中使用正则表达式来匹配不以给定模式开头的字符串吗?如果是这样,你可以使用下面的语法来查找所有的字符串,除了那些不以https开始的字符串。r"^(?!https).*&...
- 先Mark后用!8分钟读懂 Python 性能优化
-
从本文总结了Python开发时,遇到的性能优化问题的定位和解决。概述:性能优化的原则——优化需要优化的部分。性能优化的一般步骤:首先,让你的程序跑起来结果一切正常。然后,运行这个结果正常的代码,看看它...
- Python“三步”即可爬取,毋庸置疑
-
声明:本实例仅供学习,切忌遵守robots协议,请不要使用多线程等方式频繁访问网站。#第一步导入模块importreimportrequests#第二步获取你想爬取的网页地址,发送请求,获取网页内...
- 简单学Python——re库(正则表达式)2(split、findall、和sub)
-
1、split():分割字符串,返回列表语法:re.split('分隔符','目标字符串')例如:importrere.split(',','...
- Lavazza拉瓦萨再度牵手上海大师赛
-
阅读此文前,麻烦您点击一下“关注”,方便您进行讨论和分享。Lavazza拉瓦萨再度牵手上海大师赛标题:2024上海大师赛:网球与咖啡的浪漫邂逅在2024年的上海劳力士大师赛上,拉瓦萨咖啡再次成为官...
- ArkUI-X构建Android平台AAR及使用
-
本教程主要讲述如何利用ArkUI-XSDK完成AndroidAAR开发,实现基于ArkTS的声明式开发范式在android平台显示。包括:1.跨平台Library工程开发介绍...
- Deepseek写歌详细教程(怎样用deepseek写歌功能)
-
以下为结合DeepSeek及相关工具实现AI写歌的详细教程,涵盖作词、作曲、演唱全流程:一、核心流程三步法1.AI生成歌词-打开DeepSeek(网页/APP/API),使用结构化提示词生成歌词:...
- “AI说唱解说影视”走红,“零基础入行”靠谱吗?本报记者实测
-
“手里翻找冻鱼,精心的布局;老漠却不言语,脸上带笑意……”《狂飙》剧情被写成歌词,再配上“科目三”背景音乐的演唱,这段1分钟30秒的视频受到了无数网友的点赞。最近一段时间随着AI技术的发展,说唱解说影...
- AI音乐制作神器揭秘!3款工具让你秒变高手
-
在音乐创作的领域里,每个人都有一颗想要成为大师的心。但是面对复杂的乐理知识和繁复的制作过程,许多人的热情被一点点消磨。...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 30天学会Python编程:16. Python常用标准库使用教程
- 强烈推荐!Python 这个宝藏库 re 正则匹配
- Python爬虫中正则表达式的用法,只讲如何应用,不讲原理
- Python数据分析实战-正则提取文本的URL网址和邮箱(源码和效果)
- python爬虫教程之爬取当当网 Top 500 本五星好评书籍
- 深入理解re模块:Python中的正则表达式神器解析
- 如何使用正则表达式和 Python 匹配不以模式开头的字符串
- 先Mark后用!8分钟读懂 Python 性能优化
- Python“三步”即可爬取,毋庸置疑
- 简单学Python——re库(正则表达式)2(split、findall、和sub)
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)