【问题标题】:Extract image from web page从网页中提取图像
【发布时间】:2021-10-01 16:11:54
【问题描述】:

如何从这个https://www.google.com/maps/@45.8118462,15.9725486,3a,75y/data=!3m7!1e2!3m5!1sAF1QipOH6lgU7bug2ndyW-9-Uq0kgKqcKDtnGei2N5Qo!2e10!6shttps:%2F%2Flh5.googleusercontent.com%2Fp%2FAF1QipOH6lgU7bug2ndyW-9-Uq0kgKqcKDtnGei2N5Qo%3Dw150-h150-k-no-p!7i3024!8i4032中提取图像

(如果链接消失,让我描述一下如何重现问题。在 Google 地图上找到任何一家商店,当您点击该商店时,左侧的商店详细信息中会显示“商店名称图片”。单击该图像以将其扩展到整个视口。)

我找到了<canvas> 元素,我猜它包含图像。我尝试在该画布元素上执行.getContext('2d'),但我一直为空。

【问题讨论】:

  • 我不确定是否要提取它,但我可以在网络选项卡中看到图像。 lh3.ggpht.com/p/…
  • 哦。有趣的。基本可以满足我的需求。但是为了提高HTML和JS知识,我也想知道怎么从DOM中提取出来。

标签: html web canvas html5-canvas


【解决方案1】:

如果您在执行getContext("2d") 时收到null,那是因为已经创建了另一种类型的上下文,在本例中是"webgl"

要将画布转换为新图像,您通常会调用canvas.toBlob()(无论上下文类型如何)。 如果您需要裁剪该画布内容,您可以将其绘制在其他画布上。
但由于他们没有阻止 WebGL 上下文丢弃其绘图缓冲区(通过在 getContext 调用中传递 preserveDrawingBuffer),因此您只能从中获得透明图像。

无论如何,这些方法都不会检索原始图像,但它们会完全创建一个新图像(可能质量较低,尺寸较大)。要检索原始图像,请检查您的开发工具的网络选项卡,或者如果您需要以编程方式执行此操作,请注入一个脚本,该脚本将欺骗所有 fetch、XHR 和 HTMLImageElement 对象以记录其资源 URL。但这会变脏。

【讨论】:

  • 那么,如果我理解正确,就没有办法从这个画布获取图像(就像在画布上看到的那样)?
  • @croraf 是的,如果您设法将脚本的调用与绘制该图像的调用完全相同的渲染帧中追加,那么您实际上可以抓住它。在单击打开该图像的链接之前,我通过执行onclick = () => requestAnimationFrame(()=>canvas.toBlob( callback )) 之类的操作设法做到了这一点,但我认为这是侥幸。或者您也可以通过带有@run-at document-start 的用户脚本插入一个脚本,该脚本将覆盖HTMLCanvasElement.prototype.getContext 以始终为webgl 上下文传递preserveDrawingBuffer 选项。
猜你喜欢
  • 2011-03-08
  • 2013-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-28
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多