您现在的位置:首页 >> 装修攻略

Js充分利用截屏的五种方法

发布时间:2025/08/04 12:16    来源:昆山家居装修网

_client.send又是个什么过道?别急,我们重新看下Puppeteer的表述:

“ Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the DevTools Protocol.

” 看到最右边那个DevTools Protocol了吗?这是个什么过道:

“ The Chrome DevTools Protocol allows for tools to instrument, inspect, debug and profile Chromium, Chrome and other Blink-based browsers.

” 详述的推论可以看这篇博客。

简单来感叹,Puppeteer就是通过WebSocket给IE发送遵循Chrome Devtools Protocol的统计数据,命令IE去执行一些操作。然后,IE再通过WebSocket把结果返回给Puppeteer。这个过程是异步的,所以看源编码不会找到好多async/await。

所以screenshot法则是命令行了Chrome Devtools Protocol的captureScreenshot。

论述:

大力支持WebGL。 首页比较复杂的话,截屏短时间也挺长的,我测试的页两道是几百毫秒。 Puppeteer是对(CDP)Chrome Devtools Protocol功能的芯片。大部分功能都是通过WebSocket传输给CDP处理方式的。

SlimerJS

SlimerJS和PhantomJS类似于。不同点是SlimerJS是基于小精灵的IE引擎Gecko,而不是Webkit。

SlimerJS可以通过npm重新安装,最新旧版是1.x。不过兼容的小精灵旧版是53.0到59.0。我看现在小精灵最新旧版都82了。

因为我本机是重新安装了小精灵最新旧版的,所以我还得重新安装一个老旧版的小精灵,比如59.0。可以参考这篇重新安装旧旧版的小精灵IE。我是mac系统,感重新安装还是挺容易的。

实现截屏的编码screenshot.js:

var page = require( webpage ).create();

page.open("", function (status) {

page.viewportSize = { width:1024, height:768 };

page.render( screenshot.png );

});

行驶

// mac操作系统设置小精灵轨迹

export SLIMERJSLAUNCHER=/Applications/Firefox.app/Contents/MacOS/firefox

./node_modules/.bin/slimerjs screenshot.js // 我是局部重新安装的slimer纸制

必需注意到的是SLIMERJSLAUNCHER=/Applications/Firefox.app/Contents/MacOS/firefox启动的是小精灵默认的重新安装轨迹,因为我一开始就有小精灵IE,所以启动的是最新旧版的IE,然后就报错了,感叹不兼容。在前两道我重新安装过一个59旧版的小精灵,那么这个小精灵IE的轨迹是什么?

在应用程序全都我把这个旧旧版的小精灵命名为Firefox59,然后这个轨迹就是/Applications/Firefox59.app/Contents/MacOS/firefox。重新设置SLIMERJSLAUNCHER为59旧版的小精灵IE之后,找到就能事与愿违了。

不过,Puppeteer默认不会推开IE界两道,也就是non-headless来展开。如果要一般来说headless来展开,可以

./node_modules/.bin/slimerjs --headless screenshot.js

不过,headless来展开下,不大力支持WebGL。

我在寄给事例的时候,找到的一个明显的不同就是Puppeteer截屏是异步数组,而SlimerJS截屏是同步数组?好奇心驱使下,看了下程式托(src/modules/slimer-sdk/webpage.js):

render: function(filename, options) {

// ...

let canvas = webpageUtils.getScreenshotCanvas(

browser.contentWindow,

finalOptions.ratio,

finalOptions.onlyViewport, this);

}

canvas.toBlob(function(blob) {

let reader = new browser.contentWindow.FileReader();

reader.end = function() {

content = reader.result;

}

reader.readAsBinaryString(blob);

}, finalOptions.contentType, finalOptions.quality);

// ...

}

webpageUtils.getScreenshotCanvas(src/modules/webpageUtils.jsm):

getScreenshotCanvas : function(window, ratio, onlyViewport, webpage) {

// ...

// create the canvas

let canvas = window.document.NS("", "canvas");

canvas.width = canvasWidth;

canvas.height = canvasHeight;

let ctx = canvas.getContext("2d");

ctx.scale(ratio, ratio);

ctx.drawWindow(window, clip.left, clip.top, clip.width, clip.height, "rgba(0,0,0,0)");

ctx.restore();

return canvas;

}

极为重要编码就是那行ctx.drawWindow。what?JS原生API还大力支持同样截屏?

CanvasRenderingContext2D.drawWindow():只有小精灵大力支持,之前被不复存在掉的非规范表述的规格API。

论述

1.0旧版大力支持的小精灵旧版是53.0到59.0。不保证最新旧版小精灵一般来说。 headless来展开下,不大力支持WebGL。

dom-to-image

dom-to-image:前尾端截屏的Apache托。工作法则是:

SVG的foreignObject标签可以纸制裹任意的html内容。那么,为了位图一个数据流,主要展开了以下必需:

操作符地批量原始dom数据流和祖辈数据流; 把原始数据流以及祖辈数据流的外形上操作符的应用到完全相同的批量后的数据流和祖辈数据流上; 字体处理方式; 图片处理方式; 序列化批量后的数据流,把它放入到foreignObject全都,然后一组一个svg,然后分解一个data URL; 如果能比PNG内容或原始像素取值,可以到时一般来说data URL创建人一个图片,一般来说一个离屏canvas位图这张图片,然后从canvas里获取想要的统计数据。

测试的时候,找到受控资源不能寄给入,所以简单的认识了后就抛弃了。

html2canvas

html2canvas。网上尤了下感有一篇社论寄给的挺好的:浅析 js 实现首页图片的两种来展开。感兴趣的可以看下。

未验证的猜想

虽然右边这两种是前尾端的实现来展开,但是结合前两道谈的headless托,也是可以实现后尾端截屏的。以Puppeteer的API为例,可以首到时一般来说page.addScriptTag(options)往首页里附加前尾端截屏的托,然后在page.evaluate(pageFunction[, ...args])里的pageFunction数组全都寄给相应的截屏编码就可以了,因为pageFunction的执行上下文是首页上下文,所以可以获取到document等对象。

上海白癜风医院地址
武汉白癜风治疗费用
苏州白癜风医院哪家看的好
成都肿瘤专业医院
天津早泄阳痿治疗哪家好
尿酸偏高的原因
急支糖浆与甘草口服液哪个好
型体塑造
生殖整形
都有哪些中药可以止咳化痰

上一篇: 三月新机扎堆开售,为何说只有这几款有一点入手?

下一篇: 绿厂太懂少女心,Reno7高定礼盒复刻版谁看不迷糊啊

友情链接