node.js实现快速截图


Posted in Javascript onAugust 27, 2016

写文章的时候经常需要插入图片,插入现有的图片很简单,有时候制作一些优秀的网站列表的时候需要添加网页截图, 这个过程非常枯燥乏味,可以考虑开发一个命令行工具传入一个url,然后生成页面截图。

使用node-webshot进行网页截图

用到的npm模块有yargs和node-webshot,关于yargs的文章参考这里 从零开始打造个人专属命令行工具集——yargs完全指南 。

node-webshot是调用phantomjs来生成网页截图的,phantomjs是非常有名的npm项目,相当于一个脚本版的WebKit浏览器 ,通过phantomjs可以使用脚本 和网页进行交互,所以phantomjs经常用来进行网页自动化测试。

phantomjs会和普通的浏览器一样加载完整的网页内容,然后在内存里面进行渲染,虽然肉眼看不到它渲染的页面,但是通过生成图片就可以看到了,node-webshot使用的就是phantomjs的render接口来获取网页截图的。

node-webshot生成谷歌首页的示例代码:

var webshot = require('webshot'); 
 
webshot('google.com', 'google.png', function(err) { 
 // screenshot now saved to google.png 
}); 
phantomjs生成谷歌首页的示例代码: 
 
var page = require('webpage').create(); 
page.open('http://github.com/', function() { 
 page.render('github.png'); 
 phantom.exit(); 
});

那为什么不直接使用phantomjs呢?一个字懒!

另外node-webshot还对文件读写进行了简单的封装,相信任何熟悉node.js的开发人员,都能很简单的写出这样的接口,但是既然轮子好用就不要自己造了。

node-webshot流式调用的写法:

var webshot = require('webshot'); 
var fs   = require('fs'); 
 
var renderStream = webshot('google.com'); 
var file = fs.createWriteStream('google.png', {encoding: 'binary'}); 
 
renderStream.on('data', function(data) { 
 file.write(data.toString('binary'), 'binary'); 
});

node-webshit还支持生成移动版的网页截图:

var webshot = require('webshot'); 
 
var options = { 
 screenSize: { 
  width: 320 
 , height: 480 
 } 
, shotSize: { 
  width: 320 
 , height: 'all' 
 } 
, userAgent: 'Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_2 like Mac OS X; en-us)' 
  + ' AppleWebKit/531.21.20 (KHTML, like Gecko) Mobile/7B298g' 
}; 
 
webshot('flickr.com', 'flickr.jpeg', options, function(err) { 
 // screenshot now saved to flickr.jpeg 
});

最后再把yargs和node-webshot进行集成,可惜这部分工作人家也帮我们做好了,直接安装就行。

npm isntall -g webshot-cli

使用desktop-screenshot进行系统截图

desktop-screenshot是一个跨平台的系统截图项目,用法和node-webshot类似,只是少了一个url参数。

var screenshot = require('desktop-screenshot'); 
 
screenshot("screenshot.png", function(error, complete) { 
  if(error) 
    console.log("Screenshot failed", error); 
  else 
    console.log("Screenshot succeeded"); 
});

这个是我的系统截图

node.js实现快速截图

问题是我用调用命令行的时候这个窗口也会出现在截图上面,而且没有太好的办法来去除这个窗口,系统截图还是使用windows自带的好用点。

图片优化

最后介绍两个图片优化的工具

imagemin

svgo

svgo使用用来优化svg图片,svg将会代替icon font成为新的趋势,

Javascript 相关文章推荐
学习并汇集javascript匿名函数
Nov 25 Javascript
使用indexOf等在JavaScript的数组中进行元素查找和替换
Sep 18 Javascript
js中关于一个分号的崩溃示例
Nov 11 Javascript
javascript常见操作汇总
Sep 03 Javascript
高性能JavaScript 重排与重绘(2)
Aug 11 Javascript
javascript和jquery实现用户登录验证
May 04 Javascript
微信公众平台获取access_token的方法步骤
Mar 29 Javascript
微信小程序实现判断是分享到群还是个人功能示例
May 03 Javascript
Node.js中console.log()输出彩色字体的方法示例
Dec 01 Javascript
微信小程序按顺序同步执行的两种方式
Dec 20 Javascript
基于Web Audio API实现音频可视化效果
Jun 12 Javascript
jquery插件实现代码雨特效
Apr 24 jQuery
购物车前端开发(jQuery和bootstrap3)
Aug 27 #Javascript
利用Angularjs和Bootstrap前端开发案例实战
Aug 27 #Javascript
轻松掌握JavaScript享元模式
Aug 27 #Javascript
JavaScript编码风格指南(中文版)
Aug 26 #Javascript
JavaScript使用forEach()与jQuery使用each遍历数组时return false 的区别
Aug 26 #Javascript
ES6中的数组扩展方法
Aug 26 #Javascript
jQuery实现微信长按识别二维码功能
Aug 26 #Javascript
You might like
php&java(三)
2006/10/09 PHP
析构函数与php的垃圾回收机制详解
2013/10/28 PHP
PHP+JS三级菜单联动菜单实现方法
2016/02/24 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
js实现右下角可关闭最小化div(可用于展示推荐内容)
2013/06/24 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
2014/11/13 Javascript
js+canvas绘制五角星的方法
2016/01/28 Javascript
jQuery日历插件datepicker用法详解
2016/03/03 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
AngularJS入门教程之过滤器用法示例
2016/11/02 Javascript
Angularjs中date过滤器失效的问题及解决方法
2018/07/06 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
node中使用log4js4.x版本记录日志的方法
2019/08/20 Javascript
nodejs对mongodb数据库的增加修删该查实例代码
2020/01/05 NodeJs
微信小程序仿抖音视频之整屏上下切换功能的实现代码
2020/05/24 Javascript
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
Python中利用sqrt()方法进行平方根计算的教程
2015/05/15 Python
python中urllib.unquote乱码的原因与解决方法
2017/04/24 Python
python itchat实现微信自动回复的示例代码
2017/08/14 Python
Python实现迭代时使用索引的方法示例
2018/06/05 Python
python 切换root 执行命令的方法
2019/01/19 Python
pycharm 批量修改变量名称的方法
2019/08/01 Python
python使用QQ邮箱实现自动发送邮件
2020/06/22 Python
CSS3利用text-shadow属性实现多种效果的文字样式展现方法
2016/08/25 HTML / CSS
HTML5新特性之type=file文件上传功能
2018/02/02 HTML / CSS
美国新蛋IT数码商城:Newegg.com
2016/07/21 全球购物
欧洲最大的球衣网上商店:Kitbag
2017/11/11 全球购物
台湾网友喜爱的综合型网路购物商城:Yahoo! 奇摩购物中心
2018/03/10 全球购物
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
网上常见的一份Linux面试题(多项选择部分)
2015/02/07 面试题
保安员岗位职责
2013/11/17 职场文书
岗位职责的含义
2013/11/17 职场文书
农村结婚典礼司仪主持词
2014/03/14 职场文书
Java spring单点登录系统
2021/09/04 Java/Android
Vue.js中v-for指令的用法介绍
2022/03/13 Vue.js