前端经常会遇到这样的业务场景,页面生成图片用于分享活动。

那么我们如何实现页面生成图片,也就是截图的功能呢

dom-to-image

dom-to-image是一个可以将任意dom节点转换为图像的js库。

安装命令:

npm install dom-to-image

使用

  • 获取png格式图片base64编码的data Url并显示

import domtoimage from 'dom-to-image'var node = document.getElementById('my-node');domtoimage.toPng(node).then(function (dataUrl) {var img = new Image();ima.src = dataUrl;document.body.appendChild(img);}).catch(function (error) {console.log(''oops, something went wrong!', error');})
  • 获得png格式图片的blob对象并且下载

domtoimage.toBlob(document.getElementById('my-node')).then(function (blob) {window.saveAs(blob, 'my-node.png');});
  • 下载压缩的jpeg格式图片

domtoimage.toJpeg(document.getElementById('my-node'), { quality: 0.95 }).then(function (dataUrl) {var link = document.createElement('a');link.download = 'my-image-name.jpeg';link.href = dataUrl;link.click();});
  • 获得svg的data Url且过滤所有的<i>

function filter (node) {return (node.tagName !== 'i');
}domtoimage.toSvg(document.getElementById('my-node'), {filter: filter}).then(function (dataUrl) {/* do something */});
  • 以Uint8Array的方式获取原始像素数据,每4个数组元素表示一个像素的RGBA数据

var node = document.getElementById('my-node');domtoimage.toPixelData(node).then(function (pixels) {for (var y = 0; y < node.scrollHeight; ++y) {for (var x = 0; x < node.scrollWidth; ++x) {pixelAtXYOffset = (4 * y * node.scrollHeight) + (4 * x);/* pixelAtXY is a Uint8Array[4] containing RGBA values of the pixel at (x, y) in the range 0..255 */pixelAtXY = pixels.slice(pixelAtXYOffset, pixelAtXYOffset + 4);}}});

实现原理

dom-to-image的实现原理主要依靠「svg标签的<foreginObject元素和canvas」

首先SVG要渲染成图片,必须要指定xmlns(命名空间),否则会直接以普通XML文档树渲染。但是如果SVG如果直接内联在XHTML中,就不能指定命名空间。而在<foreginObject>中允许包含任意的HTML内容,使得SVG能够正常渲染。

另外就是canvas绘图。

    function draw(domNode, options) {return toSvg(domNode, options).then(util.makeImage).then(util.delay(100)).then(function (image) {var canvas = newCanvas(domNode);canvas.getContext('2d').drawImage(image, 0, 0);return canvas;});

让我们来整理一下实现过程:

  • 递归DOM节点,获取对应的XML代码

  • 将XML放在<foreginObject>元素中,渲染成变成SVG图形

  • 使用canvas.drawImage()方法将图片放在画布上

  • 使用canvas.toDataURL()方法转换成PNG图片或JPG图片

在网页如何实现截图的功能相关推荐

  1. Leaflet框选截图 网页框选截图 -- 类似QQ截图功能

    Leaflet框选截图 网页框选截图 -- 类似QQ截图功能 功能需求 搜索资源 功能拆分 进阶功能 结束语 实现截图(红框中即是将要截取的内容) 下载到本地的截图 功能需求 近日. 项目中有一需求: ...

  2. android拍照截图组件,Android_Android实现从相册截图的功能,在这篇文章中,我将向大家展 - phpStudy...

    Android实现从相册截图的功能 在这篇文章中,我将向大家展示如何从相册截图. 先看看效果图: 上一篇文章中,我就拍照截图这一需求进行了详细的分析,试图让大家了解Android本身的限制,以及我们应 ...

  3. 微信长按网页保存为截图

    本文是我处理问题时看到的一篇博客,感觉很详细,所以保存了, 原文地址 H5项目中的一个重要功能需求:实现微信长按网页保存为截图. 这里有个栗子(请用微信打开,长按图片即可保存):3分钟探索你的知识边界 ...

  4. Python将网页转化为PDF(python网页自动长截图)

    初次实践:python网页自动截图 步骤如下: (1) 安装python selenium 库,推荐使用pip快速安装最新版本 pip install selenium (2) 检查Chrome浏览器 ...

  5. 怎么在html中复制粘贴图片,在网页中粘贴截图那些事儿

    原标题:在网页中粘贴截图那些事儿 (点击上方公众号,可快速关注) 作者:郑武江(@OAuth_v2) 链接:seejs.me/2016/11/30/paste-snapshot/ 做这个尝试,只为了解 ...

  6. 本地如何预览php文件上传,如何实现js上传图片本地预览同时支持预览截图的功能...

    在项目中经常会用到js上传图片本地预览的效果,同时需要在预览图上直接预览截图的范围. 下面是我写的简单的demo,是用js结合cropper.js模拟实现此项前端的功能,后台则不考虑. 准备:引入文件 ...

  7. chroom浏览器网页二维码生成功能的方法

    谷歌浏览器二维码生成功能 在没有二维码的时候,我们如果要将电脑网页端的内容分享到移动端时,通常会复制内容,然后在粘贴到第三方通讯工具(微信.QQ)上发送给手机 其实早在Chrome85桌面端就上线网页 ...

  8. 国际网页短信软件平台后台功能篇|移讯云短信系统开发

    国际网页短信软件后台功能篇|移讯云短信系统开发 平台外放接口介绍 支持接入CMPP接口,支持smpp通道接入,支持外放CMPP接口(其他平台可以通过CMPP接入我平台),支持HTTP API JSON ...

  9. 如何实现网页版滚动截图

    如何实现网页版滚动截图 不是长截图,只截图当前页面的话使用QQ截图(Ctrl+Shift+a)微信截图(Alt+a)即可 方法一 工具:浏览器即可 按键盘上的F12按键,打开浏览器的console菜单 ...

最新文章

  1. 干货|100张PPT讲透工业机器人的机械结构
  2. 重新学习web后端开发-002-hello, world
  3. Windows XP添加网络打印机的方法
  4. 计算机设备抽象,计算机系统原理(三) 金字塔形的存储设备、操作系统的抽象概念...
  5. shell中的比较(if运算)
  6. 冯珊珊_模拟器企业衡泰信签约冯珊珊,推动高尔夫运动下沉
  7. 大数据(9) - Flume的安装与使用
  8. 小米荣耀互怼:头部高管们神仙打架 到底谁是谁非?
  9. vue过滤器微信小程序过滤器和百度智能小程序过滤器
  10. css学习_css用户界面样式
  11. 鸿蒙系统当贝市场,鸿蒙os2.0系统怎么安装?ota即可!能与当贝d3x投影仪大屏玩?...
  12. 20171129-构建之法:现代软件工程-阅读笔记
  13. 洛谷 P1420 最长连号【最长合法子序列/断则归一】
  14. python属于面向对象的还是面向过程的呀-面向过程和面向对象的理解
  15. 基于web的电影院订票系统(毕设系统,到手可用)
  16. 大华.dav视频格式转avi的一种办法
  17. sqlite转sql2000数据库
  18. 微信机器人 DIY 从 0 到 1
  19. WebRTC 概念介绍--一篇读懂source、track、sink、mediastream
  20. python如何写日志_python写日志

热门文章

  1. linux安装cuda需要先安装NVIDIA显卡驱动
  2. 国外智慧小镇_小镇上网
  3. python串口类_Python中serial的使用
  4. 数据分析与挖掘实战-电商产品评论数据情感分析
  5. 一女大学生售楼小姐卖楼内幕
  6. python爬取电影天堂(requests模块)
  7. for循环和label语句
  8. redis客户端Jedis和Luttuce的区别,并使用springboot整合
  9. PID温度控制的实现
  10. php模拟关注微博,PHP基于laravel框架获取微博数据之一 模拟新浪微博登录