代码之家  ›  专栏  ›  技术社区  ›  Ivan

向firefox扩展添加屏幕截图功能

  •  7
  • Ivan  · 技术社区  · 14 年前

    理想情况下,我希望能够拍摄dom元素的屏幕截图(不管它在页面上是否可见),例如:

    var screenshot=screenshot(document.getElementById('example');

    任何提示或建议将是很好的,搜索 https://developer.mozilla.org/

    3 回复  |  直到 14 年前
        1
  •  13
  •   Ivan    14 年前

    1. 找到元素的尺寸和左上角坐标。
    2. 将窗口部分复制到画布。
    3. 将画布转换为base64 PNG文件。
    function getElementScreenshot(elm) {
        var x = findPosX(elm);
        var y = findPosY(elm);
        var width = elm.clientWidth;
        var height = elm.clientHeight;
        var cnvs = document.getElementById("aCanvas");
        cnvs.width = width;
        cnvs.height = height;
        var ctx = cnvs.getContext("2d");
        // To take a snapshot of entire window
        // ctx.drawWindow(mainWindow.content, 0, 0, mainWindow.innerWidth, mainWindow.innerHeight, "rgb(255,255,255)");
        ctx.drawWindow(mainWindow.content, x, y, width, height, "rgb(255,255,255)");
        return(cnvs.toDataURL());
    }
    

    查找元素左上角坐标的步骤

    function findPosX(obj) {
        var curleft = 0;
        if (obj.offsetParent) {
            while (1) {
                curleft += obj.offsetLeft;
                if (!obj.offsetParent) {
                    break;
                }
                obj = obj.offsetParent;
            }
        } else if (obj.x) {
            curleft += obj.x;
        }
        return curleft;
    }
    
    function findPosY(obj) {
        var curtop = 0;
        if (obj.offsetParent) {
            while (1) {
                curtop += obj.offsetTop;
                if (!obj.offsetParent) {
                    break;
                }
                obj = obj.offsetParent;
            }
        } else if (obj.y) {
            curtop += obj.y;
        }
        return curtop;
    }
    

    从侧边栏访问browser.xul

    var mainWindow = window.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                           .getInterface(Components.interfaces.nsIWebNavigation)
                           .QueryInterface(Components.interfaces.nsIDocShellTreeItem)
                           .rootTreeItem
                           .QueryInterface(Components.interfaces.nsIInterfaceRequestor)
                           .getInterface(Components.interfaces.nsIDOMWindow);
    
    mainWindow.gBrowser.addTab(...);
    
        2
  •  2
  •   davr    14 年前

    下载众多Firefox屏幕捕获扩展中的一个,看看它们的代码,看看它们是如何做到的。如 Screengrab , Fireshot ,或 Page Saver

        3
  •  2
  •   Tyler    14 年前

    1. 将有问题的DOM元素复制到单独的iframe或浏览器(用户看不到)