Chrome浏览器网页截全屏算法以及实现
做个一个简单的批量下载插件叫“挖一下”, 正如插件的名字一样,采集网页里面的所有图片,根据筛选条件过滤不需要的图片,最后下载选中的图片。
索性把网页也一起给截了,截屏分两种:
1.可见内容截屏
2.完整网页截屏(包括可见和不可见)
可见内容截屏:
实现原理:直接通过chrome自带的截屏方法(chrome.tabs.captureVisibleTab),回调函数返回图片类型和数据信息
chrome.tabs.captureVisibleTab({format:'png'}, function(screenshotUrl) {
// 保存screenshotUrl, image信息,默认使用png格式
});
完整网页截屏
实现原理:因为chrome本身没有提供类似的截全屏的接口,或者不知道;于是找了很多方法,最终使用的方法就是自动滚动网页,然后一屏一屏的截(还是chrome.tabs.captureVisibleTab),并将这些小的截屏数据保存到缓存,通过canvas来合并。步骤如下:
(1)根据当前网页的scrollWidth和scrollHeight以及可视区域的clientWidth和clientHeight来计算最后需要截屏几次, 将网页整个网页拆分成多个截屏数据块。截屏代码如下:
var scrollWidth = document.body.scrollWidth;
var scrollHeight = document.body.scrollHeight;
var visibleWidth = document.documentElement.clientWidth;
var visibleHeight = document.documentElement.clientHeight;
// 根据可视区域计算整个网页可以拆分成多少行多少列
var columns = Math.ceil(scrollWidth*1.0 / visibleWidth);
var rows = Math.ceil(scrollHeight*1.0 / visibleHeight); var canvas_data = {
size: {full_width: scrollWidth, full_height: scrollHeight, page_width: visibleWidth, page_height:visibleHeight},
table:{rows: rows, colums: columns},
screenshots: []
}; // 最后一行行的循环滚动页面截屏
for(var r=0; r<rows; r++) {
document.body.scrollHeight = r*visibleHeight;
for(var c=0; c<columns; c++) {
document.body.scrollLeft = c*visibleWidth;
// 截屏并保存
chrome.tabs.captureVisibleTab({format:'png'}, function(screenshotUrl) {
canvas_data.screenshots.push({row: r, column: c, data_url: screenshotUrl});
});
}
}
(2)通过canvas合并图像。
截屏之后得到一个截屏数组,数组的每一个元素都带有一个行号和列号,代表这个图像是网页的第几行第几列的图小。
当前网页的scrollWidth和scrollHeight创建一个canvas,根据元素信息以及以及可视区域的clientWidth和clientHeight,将图片一张张画到canvas。
function merge_images(canvas_data, image_element) {
// initialize canvas
var canvas = document.createElement("canvas");
canvas.width = canvas.size.full_width;
canvas.height = canvas.size.full_height;
draw_image(canvas, canvas_data, 0, image_element);
}
function draw_image(canvas, canvas_data, n, image_element) {
var screenshots = canvas_data.screenshots;
if(n >= screenshots.length ) {
// draw completed
image_element.src = canvas.toDataURL('image/png');
} else {
console.log('draw '+n+' image');
var draw_context = canvas.getContext("2d");
var s = screenshots[n];
var row = s.row;
var column = s.column;
var x=0, y=0;
if(row < canvas_data.table.rows-1) {
y = row*canvas_data.size.page_height;
} else { // last row
y = canvas.height - canvas_data.size.page_height;
}
if(column < canvas_data.table.columns-1) {
x = column*canvas_data.size.page_width;
} else { // last column
x = canvas.width - canvas_data.size.page_width;
}
console.log('x:' + x + ', y=' + y);
var memory_image = new Image();
memory_image.onload = (function(ctx, m, l, t) {
return function() {
console.log('image load ok');
ctx.drawImage(m,l,t);
draw_image(canvas, canvas_data, ++n, image_element);
}
})(draw_context, memory_image, x, y);
memory_image.src = s.data_url;
}
}
当canvas画图结束后,用img元素显示图像,代码如下:
image_element.src = canvas.toDataURL('image/png');
到此ok了,折腾好几天了,
插件源码地址:http://git.oschina.net/iknown/wayixia-chrome-extension
Chrome浏览器网页截全屏算法以及实现的更多相关文章
- selenium实现网页截全屏
from selenium import webdriver options = webdriver.ChromeOptions() options.add_argument('--headless' ...
- HTML5实现网页的全屏切换
使用HTML5提供的JavaScript Api可以实现主流浏览器的全屏和退出全屏操作,封装成进入全屏和退出全屏的函数如下: //进入全屏 function enterFullScreen() { v ...
- ios开发之滑动长图截全屏应用
最近做项目遇到要求截取图片长度超出手机屏幕,即可滑动的长图截屏,这里简单说一下解决思路,下面附带Demo下载地址. ,当我们要截全屏时,将滑动视图的frame以及偏移量记录下来,然后将滑动视图偏移量设 ...
- Python_selenium之获取当前页面的href属性,id属性,图片信息和截全屏
Python_selenium之获取当前页面的href属性,id属性,图片信息和截全屏 一. 获取当前页面的全部信息 1. 图片信息包括图片名称.图片大小等信息 2. 只需将图片信息打印出来(ima ...
- X5内核浏览器video自动全屏解决办法-canvas
最近在做手机端上面播放视频的项目,但是在安卓上面,video的播放是脱离页面,置于最顶层的,所以带来了很多问题,为了解决这个问题,查看了多方资料,写了下面简单的demo,方便以后使用. 下面就是运用c ...
- 利用 chrome 做本地HTML5全屏应用
现在HTML5已经很强大了,如何让网页看起来像本地应用呢?仅chrome浏览器就可以实现.(但当然只能使用HTML的功能,不能操作本地系统) 以百度为例: 使用chrome打开百度 https://w ...
- IPhoneX网页布局 全屏布局(转)
IPhoneX全面屏是十分科技化的,但是由于其圆角和摄像头刘海位置以及操控黑条的存在使得我们需要去对其样式做一些适配,没有X的同学可以开启 Xcode 9 的iPhone X 模拟器作为学习和调试. ...
- 解决微信浏览器内video全屏问题
前端离职,让我写个视频播放页面,木办法只有我来搞了. 默认用h5的 video标签 测试时候发现微信浏览器内访问video自动全屏播放. 搜了下 webkit-playsinline="tr ...
- 解决Ubuntu下Chrome浏览器网页中文字体混乱
在Ubuntu下使用Chrome浏览器时碰到了网页中文字体混乱的现象: 黑体和楷体混杂,看起来非常不美观. 这是由于许多网页并没有指定字体,然后浏览器将调用系统默认字体配置. 首先,安装文泉驿字体: ...
随机推荐
- 《python源代码剖析》笔记 python虚拟机中的函数机制
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1.Python虚拟机在运行函数调用时会动态地创建新的 PyFrameObject对象, 这 ...
- WinForm播放视频
原文:WinForm播放视频 1背景 这几天一老友要求我做个小软件,在WinForm播放视频.印象中微软有个WM控件直接可以使用,晚上研究下 2实现方式 2.1微软草根 最简单的方式,是直接使用微软的 ...
- <转>如何利用socket进行HTTP访问
原文:<转>如何利用socket进行HTTP访问 如何利用socket进行HTTP访问 平常我们要访问某个URL一般都是通过浏览器进行:提交一个URL请求后,浏览器将请求发向目标服务器或者 ...
- DELL iDRAC 远程虚拟机报错:虚拟介质分离或所选虚拟磁盘驱动器的虚拟介质重定向已由另一用户使用
原因很简单,那就是虚拟介质的映射功能,只能被使用一次. 推荐做法: 1.由于通过远程,在Lifecycle Controller里DeployOS安装系统,需要在虚拟介质里映射ISO,因此映射功能要留 ...
- NET Socket服务编程
smark https://github.com/IKende/ .NET Socket服务编程之-高效连接接入编 在.NET上编写网络服务深入都有2,3年了,而这些时间时如何在.NET里实现网络服务 ...
- js 拖拽实现
代码参考 <!DOCTYPE html> <html lang="en"> <title>拖拽</title> <head&g ...
- 求最短路径算法之SPAF算法。
关于求最短路径: 求最短路径的算法有许多种,除了排序外,恐怕是OI界中解决同一类问题算法最多的了.最熟悉的无疑是Dijkstra(不能求又负权边的图),接着是Bellman-Ford,它们都可以求出由 ...
- SQL Mon 介绍
原文:SQL Mon 介绍 这是一个相当高级的SQL Server监控工具,全面监控SQL Server的活动与性能,分析性能瓶颈,给出优化建议. red-gate有一个在线的数据库监控工具,不过那个 ...
- struts2 <s: select 标签值
JSP页面: <s:select label="家长导航" value="id" name="navson.pid" list=&q ...
- ssh常用用法小结
ssh常用用法小结 1.连接到远程主机: 命令格式 : ssh name@remoteserver 或者 ssh remoteserver -l name 说明:以上两种方式都可以远程登录到远程主机, ...