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

时间: 2024-10-26 00:43:02

Chrome浏览器网页截全屏算法以及实现的相关文章

通过私有协议在Chrome浏览器网页中打开本地程序

最近甲方有这样一个需求:两套系统,一套基于Chrome开发,一套基于IE开发,想要在Chrome中增加一个链接,然后进入IE开发的系统.也就是说,想要在Chrome中创建链接跳转到IE浏览器指定页面,还要实现跳转动画效果.这个需求我们先来解决从Chrome跳转到IE的问题. 问题分析:从Chrome中跳转到IE,直接以http链接形式是不可能跳转到IE的,只能通过单独开发的本地程序打开IE,问题是如何让Chrome打开该程序.有一种方法可以实现:通过注册私有协议,用户点击链接的时候直接使用私有协

ios开发之滑动长图截全屏应用

最近做项目遇到要求截取图片长度超出手机屏幕,即可滑动的长图截屏,这里简单说一下解决思路,下面附带Demo下载地址. ,当我们要截全屏时,将滑动视图的frame以及偏移量记录下来,然后将滑动视图偏移量设为0,frame改为滑动视图的 contentSize,然后生成图片进行保存,代码实现如下: // 下面方法,第一个参数表示区域大小.第二个参数表示是否是非透明的.如果需要显示半透明效果,需要传NO,否则传YES.第三个参数就是屏幕密度了,调整清晰度. UIGraphicsBeginImageCon

HTML5实现网页的全屏切换

使用HTML5提供的JavaScript Api可以实现主流浏览器的全屏和退出全屏操作,封装成进入全屏和退出全屏的函数如下: 1 //进入全屏 2 function enterFullScreen() { 3 var de = document.documentElement; 4 if (de.requestFullscreen) { 5 de.requestFullscreen(); 6 } else if (de.mozRequestFullScreen) { 7 de.mozReques

X5内核浏览器video自动全屏解决办法-canvas

最近在做手机端上面播放视频的项目,但是在安卓上面,video的播放是脱离页面,置于最顶层的,所以带来了很多问题,为了解决这个问题,查看了多方资料,写了下面简单的demo,方便以后使用. 下面就是运用canvas重绘video视频. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport&quo

利用 chrome 做本地HTML5全屏应用

现在HTML5已经很强大了,如何让网页看起来像本地应用呢?仅chrome浏览器就可以实现.(但当然只能使用HTML的功能,不能操作本地系统) 以百度为例: 使用chrome打开百度 https://www.baidu.com/ 打开chrome 菜单>更多工具>创建应用快捷方式 将在桌面创建一个打开网站的快捷方式,打开快捷方式,则浏览器无地址栏,看起来像个应用了. 但还有标题栏,如何全屏运行呢?在应用的快捷方式后面添加参数 --kiosk,就可全屏. 当然如果你压根都没有网站或不需要联网,则可

解决微信浏览器内video全屏问题

前端离职,让我写个视频播放页面,木办法只有我来搞了. 默认用h5的 video标签 测试时候发现微信浏览器内访问video自动全屏播放. 搜了下 webkit-playsinline="true" playsinline="true" x-webkit-airplay="true" x5-video-player-type="h5" x5-video-player-fullscreen="true" x5-

钉钉网页版全屏

官方只提供了mac版和win版,没有linux版,在linux只能运行网页版,但是即使你F11全屏了,钉钉的窗口并不会全屏,还是在中间,如何解决全屏? 1. 确保你扫码登录了网页版钉钉,进入了会话界面 2. 按下F12,在控制台输入一下js代码,回车运行即可: document.getElementById("layout-main").style.width='100%'; document.getElementById("layout-main").style.

解决Ubuntu下Chrome浏览器网页中文字体混乱

在Ubuntu下使用Chrome浏览器时碰到了网页中文字体混乱的现象: 黑体和楷体混杂,看起来非常不美观. 这是由于许多网页并没有指定字体,然后浏览器将调用系统默认字体配置. 首先,安装文泉驿字体: sudo apt-get install ttf-wqy* 编辑字体设置 sudo gedit /etc/fonts/conf.avail/69-language-selector-zh-cn.conf 可以设置字体的优先级,个人比较喜欢文泉驿正黑(WenQuanYi Zen Hei) 最后,重启电

webview加载网页与全屏播放视频?

上篇我们大致了解了webview的一些属性,以及重要的方法.这篇我们就要一些案列来说明,一般webview最广泛的作用就是,加载一个html的网页(实现与js交互),,webview加载网页网页当中含有视频,webview文件下载等等. 首先我们来了解下webview是如何加载网页的?首先我们看下网页在家的效果? 代码也是比较简单 1 package cn.xiao.webviewplayvideo; 2 import android.app.Activity; 3 import android