百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

H5分享截图方案优化 h5截取页面分享图片

zhezhongyun 2024-12-29 07:17 70 浏览

背景

分享是传播活动,吸引用户最重要的一环。现有分享手段多是题目配合单张图片,利用点击的方式跳转到目标页面。在信息越来越丰富的今天,单个题目和图片对用户的吸引力是有限的。而在对推广要求更高的营销场景和裂变过程中,我们往往需要将页面内容一部分作为图片整体分享出去。直接利用手机原生的截屏功能会有几个问题:

  • 内容格式无法自定义。

  • 翻页情况无法处理。

  • 视窗区域不可控。

本文通过讨论现有截屏的方案和闲鱼内部截屏方案,介绍如何利用web实现移动端高还原度富图文分享。

现有方案:Html2Canvas

介绍

html2canvas是一种基于canvas,将DOM结构绘制在canvas上面产生图片的第三方库。通过如下的方式可以将对应的DOM结构绘制成图片保存出来。优势在于上手简单,使用方便。

绘制原理

原理如下图所示。核心逻辑是克隆对应节点DOM结构,利用parse解析成数据,构建canvas进行内容绘制,返回对应的canvas。

实际使用中发现存在如下问题

  • 图片跨域不支持。生成的图片存在跨域限制问题。

  • 绘制清晰度低。即使使用apiscale放大后绘制,又会由于生成base64格式图片内容过长导致无法传输。

  • 圆弧计算精度低。由于html2canvas是计算像素后绘制到canvas上,而canvas展示又会经过浏览器绘制,导致像素精度降低。

  • 深度节点出现黑色情况。由于DOM结构过深,经过像素计算后,会偶尔出现像素丢失情况。

现有方案:SVG

介绍

该方案是利用svg可以包裹DOM结构的特性,将对应目标装载进去,之后将svg导出成base64格式的图片。使用方式如下。通过xmlns指定命名空间,防止多集合下元素和属性的冲突。后缀中的 svgxhtml分别表示解析方式。利用不同的解析方式,实现了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节点绘制方案,并在站内活动中使用富图文分享。相信在不久的将来,我们能够利用移动端截屏分享功能帮助更多闲鱼用户高效率分享内容,让用户乐在闲鱼,玩在闲鱼。

相关推荐

Go语言标准库中5个被低估的强大package

在Go语言的世界里,开发者们往往对fmt、net/http这些“明星包”耳熟能详,却忽略了标准库里藏着的一批“宝藏工具”。它们功能强大却低调内敛,能解决并发控制、内存优化、日志管理等核心问题。今天就带...

作为测试人,如何优雅地查看Log日志?

作为一名测试工程师,测试工作中和Linux打交道的地方有很多。比如查看日志、定位Bug、修改文件、部署环境等。项目部署在Linux上,如果某个功能发生错误,就需要我们去排查出错的原因,所以熟练地掌握查...

Java 从底层与接口实现了解String、StringBuffer、StringBuilder

String、StringBuffer和StringBuilder的接口实现关系:String:字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。用于存放字符...

FluentData 从入门到精通:C#.NET 数据访问最佳实践

简介FluentData是一个微型ORM(micro-ORM),主打「FluentAPI」风格,让开发者在保持对原生SQL完全控制的同时,享受链式调用的便捷性。它与Dapper、Massi...

团队协作-代码格式化工具clang-format

环境:clang-format:10.0.0前言统一的代码规范对于整个团队来说十分重要,通过git/svn在提交前进行统一的ClangFormat格式化,可以有效避免由于人工操作带来的代码格式问题。C...

C# 数据操作系列 - 15 SqlSugar 增删改查详解(超长篇)

0.前言继上一篇,以及上上篇,我们对SqlSugar有了一个大概的认识,但是这并不完美,因为那些都是理论知识,无法描述我们工程开发中实际情况。而这一篇,将带领小伙伴们一起试着写一个能在工程中使用的模...

Mac OS 下 Unix 使用最多的100条命令(收藏级)

MacOS内置基于Unix的强大终端(Terminal),对开发者、运维工程师和日常用户来说,掌握常用的Unix命令是提升效率的关键。本文整理了100条在MacOS下最常用的U...

C语言字符串操作总结大全(超详细)

C语言字符串操作总结大全(超详细)1)字符串操作strcpy(p,p1)复制字符串strncpy(p,p1,n)复制指定长度字符串strcat(p,p1)附加字符串strncat...

经常使用到开源的MySQL,今天我们就来系统地认识一下

作为程序员,我们在项目中会使用到许多种类的数据库,根据业务类型、并发量和数据要求等选择不同类型的数据库,比如MySQL、Oracle、SQLServer、SQLite、MongoDB和Redis等。今...

电脑蓝屏代码大全_电脑蓝屏代码大全及解决方案

0X0000000操作完成0X0000001不正确的函数0X0000002系统找不到指定的文件0X0000003系统找不到指定的路径0X0000004系统无法打开文件0X0000005拒绝...

8个增强PHP程序安全的函数_php性能优化及安全策略

安全是编程非常重要的一个方面。在任何一种编程语言中,都提供了许多的函数或者模块来确保程序的安全性。在现代网站应用中,经常要获取来自世界各地用户的输入,但是,我们都知道“永远不能相信那些用户输入的数据”...

css优化都有哪些优化方案_css性能优化技巧

CSS优化其实可以分成几个层面:性能优化、可维护性优化、兼容性优化以及用户体验优化。这里我帮你梳理一份比较系统的CSS优化方案清单,方便你参考:一、加载性能优化减少CSS文件体积压缩CSS...

筹划20年,他终于拍成了这部电影_筹划20年,他终于拍成了这部电影英语

如果提名好莱坞最难搞影星,你第一时间会联想到谁?是坏脾气的西恩·潘,还是曾因吸毒锒铛入狱的小罗伯特·唐尼,亦或是沉迷酒精影响工作的罗素·克劳?上述大咖,往往都有着这样或那样的瑕疵。可即便如此,却都仍旧...

Keycloak Servlet Filter Adapter使用

KeycloakClientAdapters简介Keycloakclientadaptersarelibrariesthatmakeitveryeasytosecurea...

一些常用的linux常用的命令_linux常用命令有哪些?

在Linux的世界里,命令是与系统交互的基础。掌握常用命令不仅能让你高效地管理文件、进程和网络,还能为你进一步学习系统管理和自动化打下坚实的基础。本文将深入探讨一些最常用且功能强大的Linux...