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 相关文章推荐
FileUpload上传图片(图片不变形)
Aug 05 Javascript
几种设置表单元素中文本输入框不可编辑的方法总结
Nov 25 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
Dec 01 Javascript
jQuery实现右侧显示可向左滑动展示的深色QQ客服效果代码
Oct 23 Javascript
node.js文件上传处理示例
Oct 27 Javascript
jquery 标签 隔若干行加空白或者加虚线的方法
Dec 07 Javascript
关于微信上网页图片点击全屏放大效果
Dec 19 Javascript
微信小程序 页面跳转及数据传递详解
Mar 14 Javascript
AngularJs 终极购物车(实例讲解)
Nov 08 Javascript
详解vue-cli项目中的proxyTable跨域问题小结
Feb 09 Javascript
JS实现点击按钮随机生成可拖动的不同颜色块示例
Jan 30 Javascript
JavaScript布尔运算符原理使用解析
May 06 Javascript
购物车前端开发(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函数计算中英文字符串长度的方法
2014/11/11 PHP
PHP访问Google Search API的方法
2015/03/05 PHP
thinkPHP模板算术运算相关函数用法分析
2016/07/12 PHP
总结PHP内存释放以及垃圾回收
2018/03/29 PHP
PHP学习记录之数组函数
2018/06/01 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
2019/05/13 PHP
分享一个asp.net pager分页控件
2012/01/04 Javascript
基于jquery的has()方法以及与find()方法以及filter()方法的区别详解
2013/04/26 Javascript
JavaScript+CSS控制打印格式示例介绍
2014/01/07 Javascript
addEventListener 的用法示例介绍
2014/05/07 Javascript
jQuery可见性过滤选择器用法示例
2016/09/09 Javascript
jquery-mobile表单的创建方法详解
2016/11/23 Javascript
前端开发必知的15个jQuery小技巧
2017/01/22 Javascript
web.js.字符串与正则表达式操作
2017/05/13 Javascript
Vue实现简单分页器
2018/12/29 Javascript
详解vue-router导航守卫
2019/01/19 Javascript
jquery获取并修改触发事件的DOM元素示例【基于target 属性】
2019/10/10 jQuery
使用Promise封装小程序wx.request的实现方法
2019/11/13 Javascript
vue项目创建步骤及路由router
2020/01/14 Javascript
[47:43]Alliance vs KG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
python模拟登录百度代码分享(获取百度贴吧等级)
2013/12/27 Python
Python中使用urllib2模块编写爬虫的简单上手示例
2016/01/20 Python
python微信聊天机器人改进版(定时或触发抓取天气预报、励志语录等,向好友推送)
2019/04/25 Python
TensorFlow tf.nn.max_pool实现池化操作方式
2020/01/04 Python
Python实现多线程下载脚本的示例代码
2020/04/03 Python
完美解决torch.cuda.is_available()一直返回False的玄学方法
2021/02/06 Python
PHP经典面试题
2016/09/03 面试题
高级技校毕业生自荐信
2013/11/18 职场文书
费用会计岗位职责
2014/01/01 职场文书
乡镇办公室工作决心书
2014/03/11 职场文书
《黄山奇石》教学反思
2014/04/19 职场文书
同学会感言
2015/07/30 职场文书
2016应届毕业生实习评语
2015/12/01 职场文书
解析探秘fescar分布式事务实现原理
2022/02/28 Java/Android
MySQL聚簇索引和非聚簇索引的区别详情
2022/06/14 MySQL