web端屏幕截屏,生成自定义海报!

在一些社群网站,经常会碰到问题、活动、商品的信息分享,这种分享通常是以海报的形式发送给好友或保存到本地。在这种场景下,海报肯定是动态变化的,所以我们要动态的渲染内容并生成图片,海报其实就是图片。
官网:html2canvas
海报示例:

在这里插入图片描述


介绍

了解 html2canvas,它是如何工作的以及它的一些局限性。
在你开始使用这个脚本以前,这里有些帮助你更好的了解脚本的好处及其的一些局限性。

关于

html2canvas 是一个 HTML 渲染器。该脚本允许你直接在用户浏览器截取页面或部分网页的“屏幕截屏”,屏幕截图是基于 DOM,因此生成的图片并不一定 100% 一致,因为它没有制作实际的屏幕截图,而是根据页面上可用的信息构建屏幕截图。

它是如何工作的

该脚本通过读取 DOM 以及应用于元素的不同样式,将当前页面呈现为 canvas 图像。
它不需要来自服务器的任何渲染,因为整个图像是在客户端上创建的。但是,由于它太依赖于浏览器,因此该库不适合在 nodejs 中使用。它也不会神奇地规避任何浏览器内容策略限制,因此呈现跨域内容将需要代理来将内容提供给相同的源。


开始

准备工作

安装依赖

npm install html2canvas

在需要的页面引入依赖

import html2canvas from 'html2canvas'

然后就可以使用html2canvas相关API了。

定义海报结构

在使用之前我们要先定义好页面,我们先在页面上写好海报的html

<view class="html2canvas"><view class="poster_title">海报标题</view><view class="img_box"><img class="img_case" src="http://image.gwmph.com/weican/2024/02/27/695aa1d4c2394be48925a6858dd68e9d.jpg" alt="" /></view><view class="poster_title" @click="getPoster()">确定分享</view>
</view>
	.html2canvas{padding: 20rpx;.poster_title{text-align: center;}.img_box{display: flex;justify-content: space-around;margin: 10rpx 0;.img_case{width: 300rpx;height: 300rpx;}}}

image.png

script部分

在这里我们要区分两种script类型,一种正常的,一种是renderjs
在一个页面中script可以有多个,它也可以写在任意位置,如果我们做正常的逻辑操作,可以在普通的script中编码;如果我们要对页面进行交互,请使用renderjs

renderjs是一个运行在视图层的js。它比WXS更加强大。它只支持app-vuewebrenderjs的主要作用有2个:

  1. 大幅降低逻辑层和视图层的通讯损耗,提供高性能视图交互能力
  2. 在视图层操作dom,运行 for web 的 js库
<script module="html2canvas" lang="renderjs">
import html2canvas from 'html2canvas';  // 引入html2canvas
export default {methods: {async getPoster() {try {const dom = document.querySelector('.html2canvas');const canvas = await html2canvas(dom,{width: dom.offsetWidth,//设置canvas尺寸与所截图尺寸相同,防止白边height: dom.offsetHeight,//防止白边logging: true, // 是否尝试记录日志useCORS: true, // 是否尝试使用CORS从服务器加载图像,解决图片跨域scale: 4, // 缩放比例,处理模糊问题,数值越大越高清dpi: 600, // 分辨率,,处理模糊问题,数值越大越高清);const base64 = canvas.toDataURL('image/jpeg', 1);console.log('生成的图片',base64);} catch(error){console.log(error)}}}
}
</script>

点击确定分享,我们则会调用getPoter来生成图片,canvas.toDataURL生成的图片为base64格式,下面是生成后的内容:

在这里插入图片描述

然后我们通过a标签图片进行下载,下面是生成海报并下载的完整逻辑。

<script module="html2canvas" lang="renderjs">
import html2canvas from 'html2canvas'; // 引入html2canvas
export default {methods: {async getPoster() {try {const dom = document.querySelector('.html2canvas'); // 获取domconst canvas = await html2canvas(dom,{width: dom.offsetWidth,//设置canvas尺寸与所截图尺寸相同,防止白边height: dom.offsetHeight,//防止白边logging: true, // 是否尝试记录日志useCORS: true, // 是否尝试使用CORS从服务器加载图像,解决图片跨域scale: 4, // 缩放比例dpi: 600, // 分辨率});const base64 = canvas.toDataURL('image/jpeg', 1);let a = document.createElement('a'); // 创建a标签a.href = base64; // 添加href属性,也就是urla.download = "posterName.png" // 设置下载名称a.click(); // 模拟点击,下载图片} catch(error){console.log(error)}}}
}
</script>

下面就是下载下来的图片
 

在这里插入图片描述

在这里插入图片描述


注意事项

1、多个script
<script>export default {name: 'html2canvas',props: {},methods: {}}
</script><script module="html2canvas" lang="renderjs">
import html2canvas from 'html2canvas';
export default {methods: {}
}
</script>

uniapp中,我们如果想要提供逻辑层和视图层的通讯效率,可能会使用renderjs,你可能会在页面中看到多个script,这是正常的,我们可能会将生成海报的功能封装成组件,通过组件传参的方式在多个页面复用,这种结构页面就可能有两个script,一个是正常的vuescrpit,用于处理正常逻辑以及接收传参和事件等,一个是用于视图层通讯的renderjs

2、html2canvas不要用image标签

我们在生成图片的时候,可能会调整清晰度和分辨率,让画面更高清,html2canvas应该使用img标签,而不是image标签,image标签不会对html2canvasscaledpi生效。

3、html2canvas对于现在的css高级属性的支持

html2canvas可能不会支持css高级属性,例如:
● background-blend-mode
● border-image
● box-decoration-break
● box-shadow
● filter
● font-variant-ligatures
● mix-blend-mode
● object-fit
● repeating-linear-gradient()
● writing-mode
● zoom
● ......
对于渐变文字裁切之类的高阶属性可能不支持,如果海报生成的时候没有生效,那就是不支持,需要思考替代方案。


最后

1、html2canvas是基于html的渲染器,只要定义好海报结构即可生成,可以看成html2canvas就是将页面结构转换成图片。
2、不要使用image标签,应该使用img标签。
3、不支持部分css高阶属性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/534829.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分析基于解析物理模型的E模式p沟道GaN高电子迁移率晶体管(H-FETs)

来源&#xff1a;Analyzing E-Mode p-Channel GaN H-FETs Using an Analytic Physics-Based Compact Mode&#xff08;TED 24年&#xff09; 摘要 随着近期对用于GaN互补技术集成电路&#xff08;ICs&#xff09;开发的p沟道GaN器件研究兴趣的激增&#xff0c;一套全面的模型…

JSONObject在Android Main方法中无法实例化问题

目录 前言一、Main(非安卓环境)方法下运行二、安卓坏境下运行三、why? 前言 原生的json,即org.json.JSONObject; 在Android Studio中的Main方法里运行报错&#xff0c;但在安卓程序运行过程正常 一、Main(非安卓环境)方法下运行 static void test() {try {// 创建一个 JSON …

[译]Python 和 TOML:新最好的朋友 (1) 了解TOM

文章目录 Python 和 TOML&#xff1a;新最好的朋友使用TOML作为配置文件配置和配置文件TOML: Tom’s Obvious Minimal LanguageTOML 模式验证 了解TOML&#xff1a;键值对Strings, Numbers, and BooleansTablesTimes and DatesArrays Python 和 TOML&#xff1a;新最好的朋友 原…

12 list的使用

文档介绍 文档介绍 1.list是可以在常数范围内的任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代 2.list的底层是带头双向链表循环结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前一个元素和…

【安装jupyter依赖nbconvert后,jupyter还是找不到nbconvert】打开jupyter notebook报错500:Internal Server Error

文章目录 1. 一般是缺少依赖项或配置问题1.1.检查运行环境&#xff1a;1.2. 安装nbconvert。1.3.jupyter --version查看还是没有&#xff0c;卸载重新安装。1.4. 还有安装&#xff0c;继续卸载重新安装1.4.1.如果删除后还是报已经存在&#xff0c;删除对应文件夹 1.5.jupyter -…

【Java - 框架 - Mybatis】(01) 普通Java项目使用Mybatis操作Mysql - 快速上手

普通Java项目使用Mybatis操作Mysql - 快速上手 说明 通过软件"IntelliJ IDEA"创建"Maven"项目完成&#xff1b;通过"Mybatis"框架操纵"MySQL"数据库完成操作&#xff1b; 环境 Java版本"1.8.0_202"&#xff1b;Windows …

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的商品识别系统(深度学习+UI界面+训练数据集+Python代码)

摘要&#xff1a;在零售行业的技术进步中&#xff0c;开发商品识别系统扮演着关键角色。本博文详细阐述了如何利用深度学习技术搭建一个高效的商品识别系统&#xff0c;并分享了一套完整的代码实现。系统采用了性能强劲的YOLOv8算法&#xff0c;同时对YOLOv7、YOLOv6、YOLOv5等…

Docker部署系列之Docker Compose安装Redis三主三从集群

在日常开发或者编程当中&#xff0c;经常需要用到redis集群&#xff0c;若是按照传统的方式&#xff0c;一个机器一个机器搭建&#xff0c;难免过于繁琐&#xff0c;故而可以通过dock er-compose编排方式&#xff0c;快速搭建。我在搭建过程当中&#xff0c;将操作记录下来&…

TS271IDT运算放大器芯片中文资料PDF数据手册引脚图图片参数价格功能

产品描述&#xff1a; TS271 是一款低成本、低功耗的单通道运算放大器&#xff0c;设计用于采用单电源或双电源供电。该运算放大器采用意法半导体硅栅CMOS工艺&#xff0c;具有出色的消耗-速度比。该放大器非常适合低功耗应用。 电源可通过引脚 8 和 4 之间连接的电阻器进行外…

如何只用pycharm创建venv虚拟环境

如何只用pycharm创建venv虚拟环境 网上貌似没有好的博客讲解&#xff0c;我之前也一直在这环境搭建上疑惑。不过照着我这博客来&#xff0c;应该没问题了。 前言 如图所示&#xff0c;我新建了一个空白文件夹。 接下来点击终端&#xff08;AltF12&#xff09; 如果发现开头…

Java异常分类(二)

RuntimeException 运行时异常&#xff1a; 派生于 RuntimeException 的异常&#xff0c;如被 0 除、数组下标越界、空指针等&#xff0c;其产生比较频繁&#xff0c;处理麻烦&#xff0c;如果显式的声明或捕获将会对程序可读性和运行效率影响很大。因此由系统自动检测并将它们交…

Docker 笔记(四)--网络

这篇笔记写的时间很久&#xff0c;记录了Docker 的网络知识&#xff0c;概念从浅入深&#xff0c;对docker网络有一个大体介绍&#xff0c;对部分细节做了详细解析&#xff0c;但涉及的知识点太多&#xff0c;未能在一篇中全部罗列&#xff0c;后续逐步完善吧。 目录 参考环境网…