用JavaScript截图

使用JavaScript截图,这里我要推荐两款开源组件:一个是Canvas2Image,它可以将Canvas绘图编程PNG/JPEG/BMP的图像;但是光有它还不够,我们需要给任意DOM(至少是绝大部分)截图,这就需要html2canvas,它可以将DOM对象转换成一个canvas对象。两者的功能结合起来,就可以把页面上的DOM截图成PNG或者JPEG图像了,很酷。

Canvas2Image

它的原理是利用了HTML5的canvas对象提供了toDataURL()的API:

1
2
var strDataURI = oCanvas.toDataURL(); 
// returns "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACt..."

这样的结果是base64编码的(事实上,image也可以通过这种方式以字符串的形式写死到页面上),所以我们还需要一个base64编解码的lib。

但是目前的缺陷也有不少,比如目前Opera和Safari只支持PNG,FireFox的支持性则好得多。

生成图片有两种方式写入页面,一种是生成一个图片对象写入页面DOM树中,这也是支持性比较好的方式:

1
2
// returns an <img> element containing the converted PNG image 
var oImgPNG = Canvas2Image.saveAsPNG(oCanvas, true );

但是如果你做一个JavaScript截图功能的话,你可能希望截图后能够自动打开保存文件的“保存”对话框:

1
2
Canvas2Image.saveAsPNG(oCanvas);
// will prompt the user to save the image as PNG.

这个方式调用会生成一个mimeType为“image/octet-stream”的数据流到浏览器,但是“保存”对话框无法识别出图片适当的后缀名,默认保存的文件在FireFox下是“xxx.part”这种名字,这是令人遗憾的地方,但是似乎没有什么好办法解决。

html2canvas

它作用于DOM加载的过程,收集其中的信息,再来绘制canvas图像,也就是说,其实它并不是将展现的DOM树截成canvas图,而是仿照DOM树重新绘制了一张canvas图。于是很多CSS样式都无法被准确识别出来,无法准确反映到图上。

其它的限制还有不少,比如:

  • javascript必须是同域的,对于跨域的情况需要使用代理服务器(API中有参数可以指定),对于image也同样;
  • frame内的DOM树无法被准确绘制;
  • 因为要绘制的是canvas图,所以像IE8这样的浏览器需要使用FlashCanvas这样的第三方库。

这个页面可以测试各个网站使用它来截图的效果,效果相当不错:

用JavaScript截图

API使用的例子:

1
2
3
4
5
6
7
8
9
10
11
html2canvas(
     [dom1, dom2],
     {
         logging: false ,
         useCORS: false ,
         proxy:   false ,
         onrendered: function (canvas){
             // canvas 就是绘制的canvas是对象
         }
     }
);

对于这一类相对小众的类库,文档都是很差的,包括API的定义,需要阅读源码,代码上写得挺清楚的。

另外,该站点下载包里面还有一个JQuery的插件,对这个API做了一个封装,可以无视。

文章系本人原创,转载请注明作者和出处(http://www.raychase.net)

注:本博客已经迁移到个人站点 http://www.raychase.net/ ,欢迎大家访问收藏,本ITEye博客在数日后将不再更新。

如何在浏览器中使用JavaScript进行屏幕截图 无论你是将屏幕截图集成到获取反馈中,还是作为应用程序的关键功能,你都需要权衡每种解决方案的利弊。使用客户端解决方案,如html2canvas或getDisplayMedia API,意味着你不需要管理任何服务器基础设施,通常图像生成得相当快。如果你需要一个像素完美的表示你的用户正在看什么,并且不介意有时晦涩难懂的权限弹出窗口,那么是一个很好的起点。如果你想快速拍摄半准确的屏幕截图,并且没有外部服务依赖,可能是正确的选择。最后,如果你愿意外包技术实现和与之相关的成本,那么屏幕截图服务可能是最佳选择。 阅读详情

相关推荐

浏览器网页JavaScript实现视频截图并下载,base64图片下载,video标签、hls.js、flv.js和webrtc等方式播放的视频进行截图并下载

以前一般截图都是在后台进行截图,前端直接获取现成的图片就可以了,现代浏览器网页可以做的事情越来越多,所以可以直接在网页上对视频进行截图,本章就讲讲如何实现JavaScript网页视频截图并下载原理和代码实现。

eguid音视频方向博客,分享经过实践检验的硬核音视频技术。FFmpeg、openCV和JavaCV音视频和图像处理系列教程发布十周年,众多开发者的严格验证。欢迎关注,一起交流探索学习最新音视频和图像处理技术 1335

js实现截图,使用 html2canvas canvas2image 保存图片

截图 获取某个元素作为图片保存 <h2>原始HTML</h2> <div style="background:red;width: 750px;" class="test"> <img src="img/20190613113648.png"/> <div id="qrcode"> <img src=...

Sunshine_night的博客 1773

JavaScript实现窗口截图(附完整源码)

JavaScript实现窗口截图(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 740

截屏功能:将html界面保存为图片(利用html2canvas)

类似于截屏的功能,将界面的全部或者某一部分保存为图片。

一天一点进步 4232

实现网页截图与JS文件下载功能的JavaScript实践

html2canvas是一个流行的JavaScript库,它能够在用户的浏览器上将HTML内容渲染成Canvas元素。这意味着您可以直接从DOM元素(如Web页面上的部分或全部)生成图片,而无需服务器端的处理。它非常适合动态生成页面截图,用于导出报表、创建缩略图、数据可视化等场景。html2canvas支持大多数现代浏览器,包括IE9+,并能基本保持与原始HTML内容一致的样式表现。它通过模拟渲染引擎的工作过程,捕获DOM结构和CSS样式,并将这些信息渲染到Canvas上。

weixin_31659095的博客 1060

无需插件的纯JavaScript网页截图功能实现

WebGL是一个用于在Web浏览器中渲染交互式2D和3D图形的JavaScript API,它基于OpenGL ES 2.0。WebGL提供了直接访问GPU的能力,允许开发人员直接在浏览器中绘制复杂的3D图形。WebGL(Web Graphics Library)是一个JavaScript API,它通过渲染管线(Graphics Pipeline)将OpenGL ES的API映射到Web浏览器,用于渲染3D和2D矢量图形。

weixin_35749796的博客 403

基于html2canvas 的简易截图工具

今天分享一个自己手写的简易截图工具(基于html2canvas),因为是在vue项目上做的,少量用了es6语法,如果不支持es6的项目上需要稍微修改下,写的时候有考虑过这个,所以只需要改引入方式、将class换成es5的构造函数写法、let和const换成var即可。 基于html2canvas要画重点*,所以生成图片跟html2canvas的规则是一样的,请熟知html2canvas的特性(比如部分css3不兼容,svg之类的,该怎么处理就按html2canvas的方法处理完再调用)* 大致思路如下: 1

夜伴钟声丶的博客 2092

JavaScript实现Web截图源码解析

本文还有配套的精品资源,点击获取 简介:本简介介绍"js截图源码"项目,主要讲解了如何使用JavaScript在Web环境中实现屏幕截图功能。涉及HTML5 Canvas绘图、Web APIs技术,以及可能需要使用的外部库。重点介绍了截图过程中的关键步骤,包括如何利用HTML5的Canvas元素将网页内容渲染并转换为图像数据,使用Web APIs获取视频流进行全屏截图,处理...

weixin_42465332的博客 2412

html5 实现网页截屏 页面生成图片(源代码)

<!DOCTYPE html> <html> <head> <meta name="layout" content="main"> <meta http-equiv="Content-Type" content="text/html; charse...

weixin_33890526的博客 655

使用html2canvas,将页面多个echarts图转成图片下载

使用html2canvas,将页面多个echarts图转成图片下载,页面实例可直接打开运行,修改了所需要的分数

比Synergy更轻量!Barrier鼠标共享工具实测:5分钟实现Win/Mac/Linux三设备无缝切换

本文实测了开源免费的Barrier鼠标共享工具,详细指导用户如何在5分钟内于Windows、macOS和Linux三台设备间实现一套键鼠的无缝切换。文章对比了其与Synergy的优势,提供了分平台安装、核心服务端-客户端配置、防火墙设置等完整教程,并分享了解决连接问题的关键技巧,是提升多设备办公效率的实用指南。

weixin_29304021的博客 594

js-screen-shot:原生JavaScript的网页自定义截图神器

**js-screen-shot** 是一款专为Web端设计的自定义截图插件,完全采用原生JavaScript编写,无需依赖任何外部库,保证了其广泛的适用性和轻量级特性。此项目由开发者[@likaia](https://github.com/likaia)维护,并托管在GitHub上,获得了超过760星和支持者的关注。 ## 核心功能 这款插件赋予了网页应用强大的屏幕捕获能力,允许用户在浏览器环...

gitblog_09052的博客 873

Multisim实战:5分钟搞定一阶RC电路仿真(附示波器波形分析技巧)

本文通过Multisim软件,详细演示了如何快速搭建一阶RC电路并进行仿真分析。文章提供了从元件选取、电路连接、虚拟示波器设置到波形观测的完整流程,并重点分享了测量时间常数、区分电路响应类型等核心分析技巧,帮助电子工程初学者和爱好者高效掌握电路仿真与分析方法。

weixin_29175469的博客 182

js 截图

使用html2canvas库。

2401_86373285的博客 260

MATLAB AppDesigner 中TextArea保留原有信息并换行显示提示信息

App Designer 中的文本区域TextArea组件,一般可以用来作为matlab app设计中的信息显示。 app.TextArea.Value = 'Hello Matlab'; Value可以是字符向量、字符向量元胞数组、字符串数组或一维分类数组。这样直接给TextArea赋值,每次赋值都会消除先前的信息,然后显示新的信息。如果想要在app实现保留原有信息、多行信息的输出,在MathWorks官方帮助中心给出了一种方法: cellArrayText{1} = sprintf('%s\n

我是麻瓜喔的博客 1万+

电脑主板开机12步流程全解析:从按下电源键到BIOS启动的完整过程

本文深入解析了电脑主板从按下电源键到BIOS启动的完整12步流程,详细阐述了待机电路、主供电上电、CPU供电建立、时钟信号分发及复位链等关键硬件协同工作原理。通过剖析电脑主板的电路结构与芯片协作时序,帮助读者构建系统性的硬件故障诊断思维,精准定位开机故障。

weixin_29290963的博客 265

【亲测免费】 js-screen-shot: 原生JavaScript端自定义截图插件安装与配置完全指南

**js-screen-shot** 是一个专为Web端设计的自定义截图插件,采用原生JavaScript编写的轻量级解决方案。这个开源项目允许开发者轻松地集成截图功能到他们的网页应用中,无需依赖额外的大型库或框架。适合从简单的网页项目到复杂的Web应用程序的各种场景。 ## 主要编程语言与关键技术 - **主要编程语言:** JavaScript (原生) - **关键技术特点:** ...

gitblog_09355的博客 894

Leaflet 加载天地图完整配置指南:从插件修改到无限缩放(附源码)

本文详细介绍了Leaflet与天地图深度集成的完整配置指南,包括插件修改、无限缩放实现及源码示例。通过解析天地图服务的WMTS协议、双投影支持和密钥机制,帮助开发者突破缩放级别限制,优化地图应用性能,适用于Web地图开发和高精度GIS系统。

weixin_27180827的博客 440

Javascript使用PhantomJS针对动态渲染网页截图

Javascript使用PhantomJS针对动态渲染网页截图 首先下载js的PhantomJS,下载地址: http://phantomjs.org/download.html 下载后解压,解压文件中的phantomjs.exe即是需要的。 然后也一个js代码文件,就可以截取动态加载渲染的网页: var page = require('webpage').create(); page...

Zhang Phil 1746

一个非常简单的变分量子分类器 (VQC)

​ 在之前的帖子(这里和这里)中,我已经开始谈论 QML,为什么以及如何学习,从现在开始,我将开始分享我的研究和发现,到目前为止,这些都是非常基本的。​

gongdiwudu的专栏 6207

4.4 直流无刷电机(BLDC):控制器硬件设计

摘要 本文详细阐述了直流无刷电机(BLDC)控制器的硬件设计要点。控制器硬件主要包括微处理器单元、功率驱动模块、信号检测电路、通信接口和电源管理模块。在微处理器选型方面,分析了ARM Cortex-M系列、DSP等架构的适用场景,并对比了不同处理器的性能参数。功率驱动模块设计重点包括栅极驱动电路、逆变桥热管理和电流保护机制。信号检测部分介绍了位置传感器接口和模拟信号调理技术。此外,还讨论了通信接口设计、电源管理方案以及硬件布局与EMC设计规范。最后强调了硬件测试验证的重要性,包括故障注入测试等验证方法。整体

技术工作者 182

js + html2canvas 实现截图

js + html2canvas 实现截图 html: <div style="margin: 160px 200px;"> <div id="html2canvas" style="display: flex;"> <div> <img class="qrcode_img" src="" alt="" style="width: 115px;height: 115px;;displa

clyss1234的博客 498

Kimodo 入门教程(一)英伟达开源人形机器人动捕数据集训练运动学动作扩散模型

Kimodo是一个基于700小时商用光学动作捕捉数据集训练的运动学动作扩散模型,能够生成高质量的人体和机器人3D动作。该模型支持通过文本提示和多种约束条件(如关键帧、末端执行器位置等)进行控制,并提供数字人类和类人机器人两种模型变体。安装方式包括软件包安装和源代码安装两种,需要配置HuggingFace令牌以访问文本编码器。推荐使用GPU加速,最低需要17GB显存。项目提供命令行生成和交互式演示两种使用方式,演示程序支持时间轴编辑和实时3D可视化。模型分为商用友好版和受限版,其中SMPL-X版本需要额外申请

2506_90492529的博客 1923

Js实现截图功能

今日想试下弄个截图功能,在网上找了些资料,终于把它实现了,步骤如下: 首先要准备4个js文件: 1)prototype.js var Class = { create: function() { return function() { this.initialize.apply(this, arguments); } }} var Extend = functio...

weixin_30855099的博客 1163

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

Javascript实现截图功能(代码)

好久没来这里了,迷糊了一段时间,为了尽快热手,自己做了一个截图的js,首先是参看了一个博友的文章,心想也许自己可以用更少的代码来实现,于是变有了这个小玩意的诞生。      我其实比较忠实于原味的js,只是用到ajax的时候会选择mootools的xhr包,辛苦的操作dom这么久了觉得也是时候启用便捷的框架提高效率了,前段时间经同事介绍认识了jquery,一见如故,done!这个截图的效果里...

iteye_7147的博客 2125

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

cocos2d-js 保存截图到相册

js代码: 在按钮中调用该函数: SaveImage: function () { var size = cc.director.getWinSize(); var fileName = "share.png"; var fullPath = jsb.fileUtils.getWritablePath() + fileName; //拿到可写路径,将图片保存在...

qq_41752041的博客 904

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

上一篇: Bootstrap: New Net-volution
下一篇: 程序员,都去写一写前端代码吧
RayChase
博客等级 码龄20年 71粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值