2010-07-08 40 views
7

是否有跨平台的方法从Firefox扩展中截屏?向Firefox扩展添加屏幕截图功能

理想情况下,我想能够采取一个DOM元素(不管它是在页面上可见或不可见)的截图,是这样的:

VAR截图截图=(的document.getElementById(”例如');

任何指针或建议将是很好,搜索https://developer.mozilla.org/仅产生,他们已经在各种指南中使用的截图

回答

13

检查几个扩展的代码后。我采取了以下方法(拍摄特定dom元素的快照)。这可以在一个Firefox扩展,可以用来把整个网页的截图,把浏览器窗口的截屏,并采取特定的DOM元素的截图(及其所有子节点):

  1. 添加画布XUL。
  2. 查找元素的尺寸和左上角坐标。
  3. 将窗口的部分复制到画布上。
  4. 将画布转换为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(...); 
+3

感谢您在这里发布回复:) – flpmor 2010-07-15 18:12:29

+0

这个解决方案的效果很好,虽然在YouTube上播放Flash视频时,如果拿SS,它会显示黑盒子而不是视频捕获。有没有解决这个问题的方法? – 2014-08-22 15:10:39

+0

@Ivan:你是否可以将它作为附件上传?我可以使用它。显然,即使在今天,也没有可以直接使用的附加组件。 – 2016-03-12 11:30:18

2

和下载Firefox的许多屏幕捕获扩展之一,并期待在他们的代码来看看。他们是怎么做的,例如ScreengrabFireshotPage Saver

+2

谢谢,我看了一对夫妇,发现页面保护程序是最容易遵循和理解的一个。 – Ivan 2010-07-09 15:33:17

2

我想这将是这样的:

  1. 复制的DOM元素中的问题,以一个单独的iframe或浏览器(这是不可见的用户)
  2. 涂料的窗口使用drawWindow()将该iframe放到HTML画布上。查看Tab Preview插件的来源,看看这是如何完成的。
+1

现在查看Tab Preview插件。谢谢 – Ivan 2010-07-09 15:33:46