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获取浏览器的可视区域尺寸的实现代码
Nov 30 Javascript
js 编码转换 gb2312 和 utf8 互转的2种方法
Aug 07 Javascript
分享一则JavaScript滚动条插件源码
Mar 03 Javascript
Bootstrap项目实战之子栏目资讯内容
Apr 25 Javascript
jQuery实现的简单拖拽功能示例
Sep 13 Javascript
EditPlus 正则表达式 实战(3)
Dec 15 Javascript
vue利用axios来完成数据的交互
Mar 23 Javascript
vue中使用element-ui进行表单验证的实例代码
Jun 22 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
May 28 Javascript
微信小程序tab切换可滑动切换导航栏跟随滚动实现代码
Sep 04 Javascript
vue-cli3.0实现一个多页面应用的历奇经历记录总结
Mar 16 Javascript
Layer UI表格列日期格式化及取消自动填充日期的实现方法
May 10 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中substr函数字符串截取用法分析
2016/01/07 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
2017/03/16 PHP
PHP如何防止用户重复提交表单
2020/12/09 PHP
jquery的ajax简单结构示例代码
2014/02/17 Javascript
深入理解Javascript中this的作用域
2014/08/12 Javascript
javascript对中文按照拼音排序代码
2014/08/20 Javascript
javaScript实现滚动新闻的方法
2015/07/30 Javascript
javascript基础语法学习笔记
2016/01/04 Javascript
jQuery fadeOut 异步实例代码详解
2016/08/18 Javascript
详解vue之页面缓存问题(基于2.0)
2017/01/10 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
2017/06/16 jQuery
基于js粘贴事件paste简单解析以及遇到的坑
2017/09/07 Javascript
微信小程序使用form表单获取输入框数据的实例代码
2018/05/17 Javascript
jQuery序列化form表单数据为JSON对象的实现方法
2018/09/20 jQuery
vue-router传参用法详解
2019/01/19 Javascript
layui原生表单验证的实例
2019/09/09 Javascript
Python open()文件处理使用介绍
2014/11/30 Python
Django中处理出错页面的方法
2015/07/15 Python
django1.11.1 models 数据库同步方法
2018/05/30 Python
python实现多人聊天室
2020/03/31 Python
python pillow模块使用方法详解
2019/08/30 Python
Tensorflow: 从checkpoint文件中读取tensor方式
2020/02/10 Python
logging level级别介绍
2020/02/21 Python
使用Python发现隐藏的wifi
2020/03/04 Python
pytorch 计算ConvTranspose1d输出特征大小方式
2020/06/23 Python
快速解释如何使用pandas的inplace参数的使用
2020/07/23 Python
澳大利亚潮流尖端的快时尚品牌:Cotton On
2016/09/26 全球购物
软件设计的目标是什么
2016/12/04 面试题
护士岗位职责
2014/02/16 职场文书
小学生一分钟演讲稿
2014/08/26 职场文书
中学生爱国演讲稿
2014/09/05 职场文书
正风肃纪剖析材料
2014/09/30 职场文书
花田少年史观后感
2015/06/16 职场文书
天气温馨提示语
2015/07/14 职场文书
谢师宴学生致辞
2015/07/27 职场文书
工作一年自我鉴定
2019/06/20 职场文书