你能否使用Canvas功能对页面进行“截屏”?

67

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

有人报告说这些东西已经错位了,但是用户有动机谎报信息以“作弊”,所以我不确定他们是否说实话。我正在尝试找到一种方法来确定他们是否在撒谎,并获得一些“证据”。

我知道Canvas有一种方法可以从图像元素或另一个画布元素(一种BitBlt操作)中复制图像信息。

是否可能使用Canvas(或其他任何东西,如Flash等)对页面的某个部分进行“截图”?
再次强调,我并不想从<image>中获取信息。我试图复制用户看到的内容,其中包括几个绝对定位的HTML元素(我最关心这些位置),并将其上传到服务器。

我知道这似乎无法实现,但也许我漏掉了什么。

有什么想法吗?

7个回答

10

之前有人问了一个与这个问题有些相似的问题。 滚动到Youtube底部,点击“报告错误”链接。 Google的反馈工具(由Javascript驱动),基本上做了您描述的事情。 根据我查看的其代码,它使用画布和基于JavaScript的JPEG编码器构建一个JPG图像以发送给Google。

这肯定需要很多工作,但我相信你可以完成类似的操作。


我确定那是Flash bud,http://feedback.googleusercontent.com/117/FlashCanvas.swf。 - RobertPitt
1
可能他们在某个时候使用Flash,但我还没有看到过。所有的图像创建都是用JavaScript和Canvas完成的。我认为如果Google没有真正使用它,他们不会在源代码中放置Javascript JPEG编码器。除此之外,我已经安装了Flashblock,所以如果它是Flash,它对我也不起作用... - simshaun
非常有趣!看起来我需要做一些逆向工程。谢谢! - Daniel Magliola
1
我认为Canvas只是用于高亮/黑屏的功能,而不是用于截屏。请查看此链接:https://dev59.com/BW445IYBdhLWcg3wWI6L - salmatron
谷歌在其主页上仅在必要时才使用Flash。从源代码来看,我认为他们甚至在搜索页面上使用了Shockwave或其他技术来实现那些交互式吉他弦。 - Montagist

7
如果您需要商业解决方案,可以考虑SnapEngage。点击右上角的“帮助”按钮即可查看其运作方式。以下是截图:

enter image description here

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

SnapEngage使用Java Applet来截取屏幕截图,这里是一篇关于其如何工作的博客文章。


非常有趣,我需要看看他们是否会让我直接调用截图的“某个东西”,而不是显示“报告错误”,因为这应该在后台发生,用户不应该注意到。但这是一个很好的指针。谢谢! - Daniel Magliola
实际上......阅读那篇文章,它似乎要求用户授权。帖子说他们可以请求更少的权限,但他们仍然需要请求。不幸的是,这对我来说不是一个选项。但还是一个好的指针,谢谢! - Daniel Magliola
Usersnap 是一个商业解决方案,可以为您提供问题的准确截图 - 即使对于Internet Explorer也是如此。同时,您的用户不需要安装任何东西(特别是没有Java或Flash!)。 - Gregor
@user824294 我责怪 StackOverflow。 - salmatron
1
@Gregor 谢谢,听起来不错。一旦网站恢复正常,我会去看看的。 - salmatron
图片无法显示,因为StackOverflow自动将“i.imgur”替换为“i.stack.imgur”。已修复。 - Camilo Martin

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并从中构建图像”。对于大多数情况来说,这应该已经足够好了。 - Camilo Martin

3
您可以使用此元素,目前仅Firefox支持。
background: -moz-element(#mysite);

这里的 #mysite 是作为背景使用的元素。
在 Firefox 中打开:http://jsfiddle.net/qu2kz/3/ (在 FF 27 上测试通过)

快照


2
有趣。这并没有完全解决问题,因为它只适用于Firefox,但是...一旦你在一个元素中拥有了那个背景,你如何以这样的方式捕获它,以便你可以将其上传到服务器? - Daniel Magliola
啊!我快要成功了。我的问题是如何将那个快照复制到画布上下文中。因为一旦你在画布上有了你的快照,那么通过发送canvas.toDataURL()方法返回的base64编码字符串,将图像保存或发送回服务器就很容易了。我会继续努力,并让你知道是否有好消息出现。 - Jose Rui Santos
现在(在您的回复两年后),是否有任何类似于-moz-element的Chrome功能? - Lorenzo Sciuto
1
很遗憾,目前只有Mozilla支持此功能,您可以在**这里**查看。 - Jose Rui Santos
@JoseRuiSantos 你有什么线索,为什么Chrome的开发人员从未实现类似的东西? - Lorenzo Sciuto
1
@LorenzoSciuto 看起来 WebKit 团队在这方面进行了一些工作,但从未发布。 (https://bugs.webkit.org/show_bug.cgi?id=44650) - Jose Rui Santos

2

1
谢谢你的回答。不幸的是,我的计划是将其用作“自动错误处理程序”,如果可以的话...在我这种情况下,我不能要求用户安装扩展。谢谢! - Daniel Magliola
这不是一个扩展,而是一个JavaScript方法,它将网页内容呈现到画布上。然后,您可以使用canvas2image将其保存为图像。我记得在Chrome中看到过它的工作方式... - trusktr

2
“它是可以做到的,但有一些限制。” 有一些技巧,这正是截图所需的扩展程序数量。从您的描述中,似乎您不是在寻找一种通用的客户端解决方案进行部署,而只是需要用户或某些用户可以使用和提交的东西,因此我想使用扩展程序应该是可以的。
Chrome:
我可以向您介绍我的开源Chrome扩展程序Blipshot,它正是这样做的: https://github.com/folletto/Blipshot 只是为了提供一些背景:
  1. 据我所知,只有从扩展程序内部使用内部函数才能够实现这一点。
  2. 该函数是chrome.tabs.captureVisibleTab,需要从清单中访问选项卡。
  3. 该函数仅抓取活动标签页的可见部分,因此如果您只需要这个部分,那就没问题了。如果您需要更多内容,则应查看整个脚本,因为在 Google 修复Bug #45209之前,获取完整页面截图相当棘手。

Firefox:

自 Firefox 1.5 以来,您可以构建使用自定义画布扩展drawWindow的扩展程序,它比 Chrome 的chrome.tabs.captureVisibleTab等效功能更强大。这里提供了一些信息: https://developer.mozilla.org/en/Drawing_Graphics_with_Canvas


1
drawWindow没有FF就不能工作吗?我记得在那里看到过关于“Chrome权限”的内容...那是Chrome浏览器还是特定于FF的东西? - trusktr
不幸的是,我正在寻找适用于普通网站的解决方案,而无需用户安装甚至知道什么是扩展程序。这也是需要在没有他们明确合作的情况下发生的事情。 - Daniel Magliola
2
@trusktr 这只是 Google 不幸的命名选择:“Chrome” 是应用程序 UI(Firefox、Safari 或其他)中不是网页的部分。具有“Chrome 权限”的插件可以完全访问 Firefox UI(因为它也是 XML)。 - Folletto
@DanielMagliola 是的。这就是我的意思:没有办法:“可以做到,但有一些限制”。我知道这不是你想要的答案,但就目前而言,这是正确的答案。 :) - Folletto

2

1
是的,我考虑过这个问题,但其中一个“假设”是我设置了正确的位置,但某种方式它们显示错误。我不太相信这一点,但这种情况可能发生,这就是为什么我正在寻找图形解决方案,以确保真正确定。 - Daniel Magliola
最好的方法是使用百分比来设置所有位置和大小,基于某个具有position:relative属性的父元素。 - trusktr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接