您可以使用Canvas对页面进行“截屏”吗?


67

我有一个页面,我们在其中使用CSS定位一堆元素,并使用JS更改它们的“顶部和左侧”位置。

我有报道说这些东西没有对齐,但是用户有动机撒谎说“欺骗”,所以我不确定他们是否在说真话。我试图找到一种方法来弄清楚他们是否在撒谎,并提供一些“证据”。

我知道Canvas具有从图像元素或另一个canvas元素(一种BitBlt操作)复制图像信息的方法。

是否可以通过Canvas(或其他方式,Flash,随便什么)以某种方式拍摄页面的“图片”?
再一次,我不是要从中获取信息<image>。我正在尝试复制用户看到的内容,它由几个绝对定位的HTML元素组成(我最关心这些位置),并以某种方式将其上传到服务器。

我知道这无法完成,但也许我遗漏了一些东西。

有任何想法吗?

Answers:


10

之前有人问过一个与此类似的问题。滚动到Youtube的底部,然后单击“报告错误”链接。Google的反馈工具(由JavaScript驱动)基本上可以完成您所描述的工作。从我对代码的了解来看,它使用画布,并且具有基于JavaScript的JPEG编码器,该编码器构建JPG图像发送给Google。

肯定会有很多工作要做,但我相信您可以完成类似的工作。



1
他们可能在某个时候使用Flash,但我还没有看到它。所有图像创建都是使用JavaScript和Canvas完成的。我以为Google除非实际使用Java JPEG编码器,否则不会在其源中放置Java JPEG编码器。除此之外,我还有Flashblock,所以如果它是Flash,对我来说将不起作用...
simshaun 2010年

很有意思!看起来我有一些反向工程要做。谢谢!
Daniel Magliola

1
我认为画布仅用于突出显示/不显示内容,而不用于截屏。检查了这一点:stackoverflow.com/questions/4912092/...
萨尔曼·冯·阿巴斯

必要时,Google会在其主页上使用Flash作为最低限度的对象。从资料来源看,我认为他们当时甚至在搜索页面上使用了Shockwave或其他工具来制作这些交互式吉他弦。
Montagist 2011年

7

如果可以选择商业解决方案,请SnapEngage。单击右上角的“帮助”按钮以查看其运行情况。这是屏幕截图:-

在此处输入图片说明

设置非常简单,您只需要复制并粘贴几行JavaScript代码即可。

SnapEngage使用Java Applet截屏,是有关其工作原理的博客文章。


非常有趣,我需要看看他们是否让我称呼带截图的“无论是什么”,而不是显示“报告错误”,因为这应该在后台发生,因此不应该使用注意。但是很好的指针。谢谢!
丹尼尔·麦格罗拉

实际上...通过阅读泰铢帖子,似乎它在询问用户许可。该帖子说,他们如何可以请求更少的权限,但是他们仍然需要询问。不幸的是,这不是我的选择。但是,尽管如此,还是一个很好的指针,谢谢!
2011年

Usersnap还是您问题的商业解决方案。您会从访问者那里获得准确的屏幕截图-甚至是Internet Explorer。而且您的用户无需安装任何程序(特别是无需安装Java或Flash!)
Gregor

@ user824294我归咎于StackOverflow。
2013年

1
@Gregor谢谢,听起来不错。网站再次启动后,将对其进行检查。
Salman von Abbas

4

是的,您可以看到以下演示在下面的代码中,我已经在body标签内定义了表格,但是当您运行此代码时,它将显示图像快照。

<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
<title>test2</title>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.js"></script> 
<script type="text/javascript" src="js/html2canvas.js?rev032"></script> 
<script type="text/javascript">
  $(document).ready(function() {
  var target = $('body');
   html2canvas(target, {
     onrendered: function(canvas) {
     var data = canvas.toDataURL();
     alert(data);
     document.body.innerHTML="<br/><br/><br/><br/><br/><br/><img src="+data+" />";
   }
 });
});
</script>       

 </head>
 <body>  
 <h1>Testing</h1>
 <h4>One column:</h4>
 <table border="1">
 <tr>
  <td>100</td>
 </tr>
 </table>
</body>

html2canvas官方文档:- http://html2canvas.hertzen.com/

要下载html2canvas.js库,如果无法从官方链接中找到您也可以使用它:-https: //github.com/niklasvh/html2canvas/downloads [我对此链接不承担任何责任:P:P:P]


1
请注意,虽然相当不错,但是它的功能与“截屏”不同,更多的是“解析DOM并从中构建图像”。对于大多数情况,这应该已经足够好了。
卡米洛·马丁

3

您可以使用Firefox当前仅支持的element

background: -moz-element(#mysite);

#mysite是其内容用作背景的元素

在Firefox中打开:http//jsfiddle.net/qu2kz/3/(在FF 27上测试)

快照


2
有趣。由于它仅是Firefox,因此不能完全解决问题,但是...一旦在元素中具有该背景,如何实际捕获它,然后将其上传到服务器?
Daniel Magliola 2014年

啊!我快到了。我的问题是如何将快照复制到画布上下文。因为一旦将快照保存在画布中,即可通过发送canvas.toDataURL()方法返回的base64编码字符串轻松保存或将图像发送回服务器。如果有好消息出现,我会继续努力,并让您知道。
Jose Rui Santos

如今(您的答复后两年),-moz-element是否具有相同的选择功能?
洛伦佐·斯休托

1
@LorenzoSciuto不幸的是,正如您在此处看到的
Jose Rui Santos

1
@LorenzoSciuto看起来Webkit团队对此做了一些工作,但从未发布过
Jose Rui Santos,

2

我认为您无法做到。但是,你可以递归获取clientHeightclientWidthoffsetTopoffsetLeft确定页面上的所有元素的位置,并将其发送回服务器。


1
是的,我想到了这一点,但是“假设”之一是我将职位设置正确,并且以某种方式显示了错误。我不太买这个,但是有可能发生,这就是为什么我要确定图形解决方案的原因。
Daniel Magliola

最好的方法是根据所有带有position:relative的父元素,对所有位置和大小使用百分比。
trusktr 2012年

2

在Firefox上,您可以创建一个使用canvas.drawWindow将Web内容绘制到画布上的插件。 https://developer.mozilla.org/en/Drawing_Graphics_with_Canvas#Rendering_Web_Content_Into_A_Canvas

我认为目前尚无办法在WebKit上做到这一点。


1
谢谢您的回答。不幸的是,如果您愿意的话,我的计划是将其用作“自动错误处理程序”。我不能要求用户在我的特殊情况下安装扩展程序。谢谢!
丹尼尔·麦格罗拉

这不是扩展,它是一种将网页内容呈现到画布的javascript方法。然后,您可以使用canvas2image将其另存为图像。我以为我看到了有关它在Chrome中工作的信息……
trusktr 2012年

2

可以做到,但有一些限制。有一些技术,而这些技术恰好是多少扩展程序可以截屏。从您的描述看来,您并不是在寻找要部署的通用客户端解决方案,而只是一个用户或某些用户可以使用并提交的东西,因此我想使用扩展会很好。

铬:

我可以将您指向我的开源Chrome扩展程序Blipshot,它确实做到了:https : //github.com/folletto/Blipshot

仅给出一些背景:

  1. 据我所知,您只能在扩展内部执行此操作,因为它使用内部函数。
  2. 该功能是chrome.tabs.captureVisibleTab并且需要从清单访问选项卡。
  3. 该功能仅捕获活动选项卡的可见部分,因此如果您只需要它就可以了。如果您需要更多内容,则应该查看整个脚本,因为在Google修复Bug#45209之前获取完整的屏幕截图非常困难。

Firefox:

在Firefox自1.5开始,您可以构建使用canvas自定义扩展名的扩展名,该扩展名drawWindowchrome.tabs.captureVisibleTabChrome强大。一些信息在这里:https : //developer.mozilla.org/en/Drawing_Graphics_with_Canvas


1
没有FF,drawWindow不起作用?我以为我在其中看到了有关“ Chrome特权”的信息?那是Chrome浏览器还是FF专用软件?
trusktr 2012年

不幸的是,我一直在寻找可以在常规网站上运行的东西,而无需用户安装甚至不知道扩展名是什么。没有他们的明确合作,这也是需要发生的事情。
Daniel Magliola 2012年

2
@trusktr这是Google的一个不幸的命名选择:“ Chrome”是应用程序用户界面(Firefox,Safari或其他)的一部分,而不是网页。具有“ Chrome特权”的插件可以完全访问Firefox UI(因为它也是XML)。
佛列托

@DanielMagliola是的。那就是我的意思:没有办法:“可以做到,但有一些限制”。我知道这不是您要寻找的答案,但是到目前为止,这是正确的答案。:)
Folletto 2012年

@Folletto Aah,我明白了。谢谢。
trusktr 2012年
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.