常常在微博上看到不少内容使用的什么长微博截图,而且截图上还附加了不少其余的信息。以前对纯前端截图有些研究,正好本博客有这个需求,今天就把这东西实现了下。javascript
须要声明的是,JavaScript 目前还不能实现网页截屏,就算之后可以实现,也必定是浏览器提供了相关接口,JS 去调用这些接口。既然不能截屏,那咱们能作的只有经过拿到像素点的信息来”拼凑”图片。php
用过 phantomJS 的同窗都知道,它提供了一个截屏函数,经过它能够整屏获取页面截图,并且他支持的格式也比较多:JPG/PNG/GIF/PDF。经过简单的两句命令就能够把一个网页截取下来:css
// render.js var webPage = require('webpage'); var page = webPage.create(); page.viewportSize = { width: 1920, height: 1080 }; page.open("http://www.taobao.com", function start(status) { page.render('taobao_home.jpeg', {format: 'jpeg', quality: '100'}); phantom.exit(); });
安装 phantomjs 以后执行下上面的文件:html
phantomjs render.js
你会发现,一张宽度很窄的淘宝首页图就保存到了同目录下的 taobao_home.jpeg
中。也有同窗使用 phantomjs 作了不少有意思的东西,好比每隔 100ms 截图,而后对比图像之间的差别,分析网页的加载状况和性能问题,甚至作网页的监控。好吧,话题收回来,继续说说其余的截屏方式,关于 phantomjs 能够移步到官网学习。前端
可以导出图片的,目前只有 canvas。页面上的元素,除了图片、视音频、SVG等,其余都是文字,均可以使用 css 样式变换出来。咱们知道,在 canvas 中是能够绘制图片和文字的,那么问题就很好解决了。java
这个方案比较粗糙,可是对于简单的页面,以上操做就能导出一张几乎与原状如出一辙的图片。固然,咱们想到的,也有人实现出来了,html2canvas
就是一个关注度很高的 js 截屏库,它考虑的内容会更多更全面。好比:git
我博客左侧的微博小图标,hover 上去有一个微博分享,这里我就使用了这个库截取博客全文视图(考虑小屏手机,我把宽度设置成 480,比较窄),其实现是很简单的:github
html2canvas(document.body).then(function(canvas) { canvas.id = 'screenshotCanvas'; document.body.appendChild(canvas); });
此时,页面的截图已经 append 到了 body 中。canvas 提供了导出图片的函数:web
var can = documeng.getElementById("screenshotCanvas"); var imgDataURI = can.toDataURL('image/png');
咱们也能够将处处的内容转化成一个 blob 流,这样就能直接经过 URI 地址来访问了。ajax
不管是 dataURI 仍是仍是 blob 流,他们都没办法当作一个 URL 在网络上访问,因此当我使用微博分享(附加图片分享)的时候,图片老是拿不到。
var shareUrl = "http://service.weibo.com/share/share.php?appkey=YOUR_APP_KEY&title="
+ title + "&url=" + url + "&searchPic=false&style=simple&pic="
+ picUrl;
这里的 picUrl 必须是一个 http 可请求到的地址,实在是无奈呀,在 coding.net 写了一个小应用,用来临时储存图片(10分钟以后删除上传图片),有须要的能够试用下:
JQuery 用户能够这样搞:
var fd = new FormData(); fd.append("img", imgBlob); $.ajax({ type: "POST", url: "http://tmpfile.coding.io/img", dataType: 'json', data: fd, crossDomain: true, processData: false, contentType: false, success: function(data){ if(data && data.path) { console.log("http://tmpfile.coding.io/tmp" + data.path); } } });
只要能拿到原始图,以后的加工处理都是比较简单的。好比如何实现画框截取某个区域的图形,思路就是截取整图,记住鼠标按下和抬起的两个点,而后从整图中抠出来就搞定了。在 QQ 空间发表说说的地方有提供截屏工具,这是由于腾讯在电脑上安装了插件,而且提供了对应的 JS 接口,JS 是没有能力直接截屏的。
好吧,了解原理就好,人家有现成的库能够用,我们不要动不动就造轮子,很差玩。
引用https://www.barretlee.com/blog/2015/09/24/screenshot-with-javascript/