【问题标题】:Getting the thumbnail image from a Web page从网页获取缩略图
【发布时间】:2013-03-08 16:41:39
【问题描述】:

我有用于从http://i.imgur.com/QvkaduU.jpg 之类的 URL 获取图像的 C# 代码,但是我如何从这样的网页中获取图像:http://imgur.com/gallery/QvkaduU

是否有任何“简单”的方法可以做到这一点,否则我将不得不获取 HTML 并构建一个 C# 解析器,该解析器在 HTML 中查找比其他所有图像都大的图像?

让我澄清一下。如果您将http://imgur.com/gallery/QvkaduU(HTML 版本)粘贴到例如 Facebook 的状态更新字段中,它将找到主图像并从中制作缩略图,这正是我正在寻找的行为。问题是,这是怎么做到的?我必须编写自己的 HTML 解析器还是有简单的方法来获得它?

【问题讨论】:

  • 你检查their API了吗?
  • 不,我希望有一个通用的解决方案,而不仅仅是针对 imgurl。
  • 我认为屏幕抓取始终是最后的手段。在大多数情况下,这样做会违反使用条款。
  • 我想你是对的。
  • 但是!如果您将最后一个 URL(HTML 版本)复制到例如 facebooks 状态更新中,它会找到主图像并对其进行拇指操作吗?这正是我正在寻找的行为。

标签: c# asp.net-mvc image


【解决方案1】:

您已经走在正确的轨道上,是的,最可靠的方法是获取 HTML,对其进行解析并查找图像,然后根据位置和大小对图像进行排名。例如,如果您找到的第一张图片足够大可以制作缩略图,那么很酷,如果它很小,您就转到下一张图片等。最好使用像 Timthumb 这样的图片插件(我认为我曾经看过一个 ASP.NET 版本)并缓存图像,这样一旦您查找了代表网站的缩略图,您就可以从 catch 中调用图像。

【讨论】:

    【解决方案2】:

    我将获取整个 HTML 源代码并使用正则表达式将所有 <img ... src="..."> 参数以及 < ... style="... background-image: ...;"> css 内联属性放入并尝试临时下载链接后面的所有文件。然后我会(尝试将其转换为位图并)检查像素大小,最大的图片应该是您想要的图片。

    Google 可能会帮助您检查像素大小和转换任何图像。

    从 HTML 源获取所有图像链接的正则表达式应该是

    <img[^>]+src=\"([^"]+)\".*?>|<[^>]+style=\"[^"]*background-image:\s*url\(\s*'?([^')])\s*'?)\s*;.*?>(未测试,但很确定)

    结果将在第 2 组或第 3 组索引中,也不要忘记在相对链接上添加当前 url 的前缀。

    【讨论】:

      【解决方案3】:

      没有简单的方法可以为任意 URL 获取“好的”缩略图。

      Facebook 这样做的算法相当复杂。页面开发人员可以通过向<head> 添加各种元标记来给它一个提示,包括:

      <meta property="og:image" content="http://url_to_your_image_here" />
      

      <link rel="image_src" href="http://www.code-digital.co.uk/preview.jpg" />
      

      (more on this)

      ...所以如果你想复制 Facebook 的算法,你需要获取页面源,解析它以获取任何“提示”,如上面的那个(你最好检查一下我没有错过任何其他“提示”格式),并在页面不包含其中一种时提出后备算法。

      更现实的解决方案是使用其他人的 URL -> 缩略图系统。

      如果你喜欢 Facebook 的版本,我认为你应该能够通过他们的 API 为给定 URL 请求 Facebook 的缩略图。

      提供此类服务的其他服务有:

      【讨论】:

        【解决方案4】:

        如果 html 页面和图像之间的 QvkaduU 部分始终相同,您可以只进行字符串替换吗?

        "http://imgur.com/gallery/QvkaduU".Replace("imgur.com/gallery","i.imgur.com") + ".jpg";

        【讨论】:

          【解决方案5】:

          你可以试试这个

          public Bitmap getImageFromURL(String sURL)
          {
              HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(sURL);
              myRequest.Method = "GET";
              HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
              System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(myResponse.GetResponseStream());
              myResponse.Close();
          
              return bmp;
          }
          

          来自 How to get an image to a pictureBox from an URL? (Windows Mobile)

          【讨论】:

          • 这个代码只会下载 url 给你的对象,如果它是一个图像,它会工作,但如果它是一个 HTML 页面,它就不会工作。我的问题是最后一个(包含图像的 HTML 页面)。
          【解决方案6】:

          你可以尝试做这样的事情吗?

          public void ProcessRequest(HttpContext context)
              {
                {
                      // load here the image 
                      ....
                      // and send it to browser
                      ctx.Response.OutputStream.Write(imageData, 0, imageData.Length);
                 }
              }
          

          您也可以在这里尝试他们所说的内容。我试过了,效果很好。

          http://www.dotnetspider.com/resources/42565-Download-images-from-URL-using-C.aspx

          【讨论】:

          • 这只会下载 URL 给你的对象,如果它只是一个图像,它可能会工作得很好,但如果它的 HTML 页面有多个图像(除了主要的大图像)会有很可能是个问题。
          猜你喜欢
          • 2014-06-18
          • 2015-12-17
          • 1970-01-01
          • 1970-01-01
          • 2012-06-02
          • 1970-01-01
          • 2012-10-28
          • 2010-11-24
          相关资源
          最近更新 更多