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 相关文章推荐
js活用事件触发对象动作
Aug 10 Javascript
javascript阻止scroll事件多次执行的思路及实现
Nov 08 Javascript
js二维数组定义和初始化的三种方法总结
Mar 03 Javascript
原生js的弹出层且其内的窗口居中
May 14 Javascript
javascript数据类型示例分享
Jan 19 Javascript
基于Vue的SPA动态修改页面title的方法(推荐)
Jan 02 Javascript
JsChart组件使用详解
Mar 04 Javascript
详解JavaScript的BUG和错误
May 07 Javascript
在vue2.0中引用element-ui组件库的方法
Jun 21 Javascript
微信小程序自定义toast弹窗效果的实现代码
Nov 15 Javascript
js获取form表单中name属性的值
Feb 27 Javascript
如何利用React实现图片识别App
Feb 18 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制作静态网站的模板框架(四)
2006/10/09 PHP
PHP 获取MySQL数据库里所有表的实现代码
2011/07/13 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
深入学习微信网址链接解封的防封原理visit_type
2019/08/15 PHP
phpstorm最新激活码分享亲测phpstorm2020.2.3版可用
2020/11/22 PHP
Javascript实例教程(19) 使用HoTMetal(6)
2006/12/23 Javascript
Jquery中显示隐藏的实现代码分析
2011/07/26 Javascript
同时使用n个window onload加载实例介绍
2013/04/25 Javascript
YUI模块开发原理详解
2013/11/18 Javascript
js中indexof的用法详细解析
2013/12/24 Javascript
Javascript写入txt和读取txt文件示例
2014/02/12 Javascript
JavaScript中String.match()方法的使用详解
2015/06/06 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
学习JavaScript设计模式(多态)
2015/11/25 Javascript
javascript正则表达式定义(语法)总结
2016/01/08 Javascript
基于gulp合并压缩Seajs模块的方式说明
2016/06/14 Javascript
Bootstrap图片轮播效果详解
2017/10/17 Javascript
JavaScript函数绑定用法实例分析
2017/11/14 Javascript
jQuery实现新闻播报滚动及淡入淡出效果示例
2018/03/23 jQuery
微信小程序日历弹窗选择器代码实例
2019/05/09 Javascript
vue 实现单选框设置默认选中值
2019/11/07 Javascript
Vue数字输入框组件示例代码详解
2020/01/15 Javascript
火车票抢票python代码公开揭秘!
2018/03/08 Python
pandas string转dataframe的方法
2018/04/11 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
2018/12/17 Python
如何使用Python进行PDF图片识别OCR
2021/01/22 Python
英国手机壳购买网站:Case Hut
2019/04/11 全球购物
物理系毕业生自荐信
2013/11/01 职场文书
小学生新学期寄语
2014/01/19 职场文书
公益广告标语
2014/06/19 职场文书
中韩经贸翻译专业大学生职业生涯规划范文
2014/09/18 职场文书
员工考勤管理制度
2015/08/06 职场文书
2016春季运动会前导词
2015/11/25 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书
《金肉人》米特&《航海王》阿鹤声优松岛实因胰脏癌去世 享寿81岁
2022/04/13 日漫
Nginx反向代理、重定向
2022/04/13 Servers