使用JavaScript截取Chrome扩展程序的屏幕截图


68

对于使用JS拍照,我进行了很多搜索,但似乎没有用。有人说使用ActiveX控件,这不适合我的情况。我希望使用JS拍照并将其上传到服务器。

Answers:


87

由于您是在Chrome扩展程序中使用该选项卡的,因此Tab API具有一种称为captureVisibleTab的方法,该方法可捕获指定窗口中当前所选选项卡的可见区域。

要使用它,您只需在权限清单中添加“标签”即可。在后台页面或弹出窗口(或其他任何扩展页面)中,您只需调用以下方法即可:

chrome.tabs.captureVisibleTab(null, {}, function (image) {
   // You can add that image HTML5 canvas, or Element.
});

您可以通过添加{quality:50}来控制属性,也可以更改格式,所有这些都在上述文档中进行了描述。

HTML5的美丽之处在于,您可以使用HTML5 Canvas更改该图像,可以轻松地操纵,变换,修改,剪辑任何想要的东西!

希望这是您的寻找!新年快乐!


2
我已经为标签添加了权限,但是当我使用“图像”警报时,会得到“未定义”。你知道为什么吗?
Ziyan Junaideen

有什么办法可以使不可见的选项卡的屏幕截图吗?
Flash Thunder

1
要截图,您需要<all_urls>权限
Vlas Bashynskyi 2015年

3
现在可以在Chrome 59中使用全页屏幕截图。您是否知道是否可以通过扩展API访问此功能?developers.google.com/web/updates/2017/04/…–
skibulk

@skibulk我认为在59中,该功能是通过向下滚动并将可见屏幕区域拼接在一起来实现的。但是,对我们来说,做到这一点真的很好:)而不是对图像进行成像...
Jonathan Lin



3

这是对我有用的另一种方法。
要求如下:
(a)以chrome扩展名捕获屏幕截图
(b)屏幕截图必须具有透明背景
(c)屏幕截图必须与其他进程通信(通过HTTP)

在本节中,我将介绍代码片段的寻址要求(b)
有用的参考资料是:
chrome扩展调试器api
chrome devtools协议调试器域
您可能想开始从最后一个函数读取代码attachToDebugger

function captureScreenshot(tabId) {

    logMsg(`{page}: captureScreenshot: status=aboutTo, tabId=${tabId}`);

    chrome.debugger.sendCommand(
        {tabId:tabId},
        "Page.captureScreenshot", 
        {format: "png", fromSurface: true},
        response => {
            if(chrome.runtime.lastError) {
                logMsg(`{back}: captureScreenshot: status=failed, tabId=${tabId}`);
            }
            else {
                var dataType = typeof(response.data);
                logMsg(`{back}: captureScreenshot: status=success, tabId=${tabId}, dataType=${dataType}`);
                saveScreenshotRemotely(response.data);
            }
        });

    logMsg(`{page}: captureScreenshot: status=commandSent, tabId=${tabId}`);
}

//---------------------------------------------------------------------------

function setColorlessBackground(tabId) {

    logMsg(`{back}: setColorlessBackground: status=aboutTo, tabId=${tabId}`);

    chrome.debugger.sendCommand(
        {tabId:tabId}, 
        "Emulation.setDefaultBackgroundColorOverride",
        {'color': {'r': 0, 'g': 0, 'b': 0, 'a': 0}},
        function () {
            logMsg(`{back}: setColorlessBackground: status=enabled, tabId=${tabId}`);
            captureScreenshot(tabId);
        });

    logMsg(`{back}: setColorlessBackground: status=commandSent, tabId=${tabId}`);
}

//---------------------------------------------------------------------------

function enableDTPage(tabId) {

    logMsg(`{back}: enableDTPage: status=aboutTo, tabId=${tabId}`);

    chrome.debugger.sendCommand(
        {tabId:tabId}, 
        "Page.enable", 
        {}, 
        function () {
            logMsg(`{back}: enableDTPage: status=enabled, tabId=${tabId}`);
            setColorlessBackground(tabId);
            /*
             * you can comment 
             * setColorlessBackground(tabId);
             * and invoke 
             * captureScreenshot(tabId);
             * directly if you are not interested in having a 
             * transparent background
             */
        });

    logMsg(`{back}: enableDTPage: status=commandSent, tabId=${tabId}`);
}

//---------------------------------------------------------------------------

function attachToDebugger(tabId) {
    chrome.debugger.attach(
        {tabId:tabId}, 
        g_devtools_protocol_version,
        () => {
            if (chrome.runtime.lastError) {
                alert(chrome.runtime.lastError.message);
                logMsg(`{back}: debugger attach failed: error=${chrome.runtime.lastError.message}`);
            }
            else {
                logMsg(`{back}: debugger attach success: tabId=${tabId}`);
                enableDTPage(tabId);
            }
        });
}

如果您的扩展程序可以连接调试器,则此方法比captureVisibleTab API更好。您也可以使用来启动Chrome,--silent-debugger-extension-api以避免信息栏指出扩展程序已开始调试。
最多

1

如果您在企业内部,则IT可能会将策略DisableScreenshots设置为true。您可以通过进入chrome:// policy进行检查并搜索此密钥。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.