如何从 TWebBrowser 获取图像到 TImage

Posted

技术标签:

【中文标题】如何从 TWebBrowser 获取图像到 TImage【英文标题】:how to get image from TWebBrowser into a TImage 【发布时间】:2020-10-12 21:58:59 【问题描述】:

我在表单顶部有一个面板,其中设置了一个小的 TMemo 作为 URL 的放置目标。在此之下,我有一个带有 2 个选项卡的页面控件。我在一个选项卡中设置了 TWebBrowser,在第二个选项卡中设置了一些其他内容。在 TWebBrowser 中,我需要登录到我们拥有的 bug 票务网站,然后浏览票证。某些门票包含指向客户希望我们使用的小图像的链接(想想徽标之类的东西)。我可以左键单击它们,然后将链接从 TWebBrowser 拖放到表单顶部的 TMemo。这会按预期获取图像的 URL 和标题。

相关的 OnDrop 事件也切换到第二个选项卡,我在其中单击“处理”按钮。这会导致浏览器导航到图像(通过 Navigate2),然后将其加载到浏览器窗口中。该图像就是此时浏览器窗口中的全部内容。

所以现在我需要代码来抓取图像并将其加载到第二个标签页上的 TImage 中。 FWIW,原始图像是PNG。

我能够从目标图像中获取图像的高度和宽度,但大多数时候我并没有让图像本身显示在 TImage 中。有时,但大多不是。我可以很好地将 PNG 加载到这些图像对象中,所以我知道它可以正确显示 PNG。

(也许有一种方法可以直接下载图像,但我无法让它工作。TWebBrowser 用于登录到提供图像的内部错误票证系统,我可以仅当它在同一个表单上并且我已经登录时才能访问该站点。否则,DL 会加载 html 登录页面而不是图像。如果在当前框架中有办法做到这一点,我愿意接受建议。)

我正在使用 IHTMLElement2.getelementsByTagName('img') 在网页上查找图像文件并抓取第一个文件(因为我知道网页上的所有内容)。

  img := getFirstImage;
  Image1_frame.Height := img.height+2;
  Image1_frame.Width := img.width+2;
  rnd := img as IHTMLElementRender ;
  rnd.DrawToDC(Image1.Canvas.Handle);

Image1 在名为 Image1_frame 的面板上与客户端对齐。所以我设置了框架的 H&W——它们设置好了。

但图像通常不可见。它只是白色的。

我看到 DrawToDC 已被弃用,但我还没有找到替换它的内容。

【问题讨论】:

"我看到 DrawToDC 已被弃用,但我还没有找到替换它的内容" - 请参阅 How to render WebBrowser to device context? “也许有一种方法可以直接下载图像,但我无法让它工作。”。是的,只要您有 URL,您就可以使用 http 客户端组件下载任何文件。您可以使用 ICS(wiki.overbyte.be 或使用 Delphi 自己的 GetIT 来获取它)或 Indy。某些 URL 是受保护的 Web 区域的一部分,因此您还必须使用 HTTP 组件进行身份验证和/或通过某些页面以获取 cookie,然后才能交付文档。 我在 Indy 中尝试了 DL 方法,但不断返回一个构成登录页面的 html 大文本块。我不知道需要什么饼干。正如我所说,这就是我将浏览器放在第一个选项卡上的原因,因此其他逻辑在与初始登录相同的会话中运行。用户在第一个选项卡上登录后,如何发出 DL 请求?这就是我不清楚的地方。我不在乎它是 Indy 还是 ICS,鉴于我已经找到了它,我只是不清楚如何去做。 如果我已经通过 TWebBrowser 组件登录了,有没有办法通过它发出下载请求?我所看到的一切都需要一个单独的组件,或者一些非常复杂的方式来做到这一点。我只是想要相当于右键单击 --> 另存为...我不想每次下载文件时都必须处理登录页面。 【参考方案1】:

您可以使用这种方法自动登录(如果需要): Automated Log In (webBrowser)

然后你可以用这个来获取图片:Image from TWebBrowser to TPicture

【讨论】:

第一部分看起来很好用;我得试一试。但是每个人都不断地向我指出使用不推荐使用的无效 DrawToDC API 的相同示例。我想看看在不是 100 多行复杂代码的地方使用什么。通常,当一个函数被弃用时,它会被另一个函数替换,该函数使用不同的参数或稍微不同的方法执行相同的操作。我所看到的只是几十行代码,这些代码使用了 API 的晦涩部分,我几乎找不到任何文档。 DrawToDC 没有简单的替代品吗?

以上是关于如何从 TWebBrowser 获取图像到 TImage的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Delphi 10.3.3 中访问 TWebBrowser.Document 时克服内存泄漏

从 Delphi 中提取 TWebBrowser 中的 iframe 内容

在默认浏览器中打开 TWebBrowser 链接

从 Delphi 10.3 中的 TWebBrowser OnNavigateError 中提取 StatusCode

PHP 获取wordpress图像附件并使用tim thumb进行裁剪

Delphi TWebBrowser[6] 获取网页所有链接(元素)