从网页中获取缩略图图片

6
我有一段C#代码,可以获取像 http://i.imgur.com/QvkaduU.jpg 这样的URL中的图像,但是我该如何从以下网页中获取图片: http://imgur.com/gallery/QvkaduU
是否有“简便”的方法可以完成这个任务,或者我必须获取HTML并构建一个C#解析器来查找比其他图片更大的图片?
让我澄清一下。如果您将 http://imgur.com/gallery/QvkaduU(HTML版本)粘贴到例如Facebook的状态更新字段中,它会找到主要图像并制作缩略图,这正是我寻找的行为。问题是如何实现?我必须编写自己的HTML解析器,还是有简便的方法可以实现此目的?

1
你有检查他们的API吗? - Filburt
不,我希望一个通用的解决方案,而不仅仅是针对imgurl。 - Banshee
1
我认为屏幕抓取总是“最后的办法”。在大多数情况下,这样做都会违反使用条款。 - Filburt
我认为你是正确的。 - Banshee
但是!如果您将最后一个URL(HTML版本)复制到例如Facebook的状态更新中,它会找到主要图像并为其制作缩略图?这正是我正在寻找的行为。 - Banshee
显示剩余2条评论
6个回答

7

对于任意URL,很难获得一个“好”的缩略图像。

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

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

或者

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

(更多信息请见)

......所以如果你想要复制Facebook的算法,你需要获取页面源代码,解析其中任何“提示”,比如上面提到的(最好检查一下我是否漏掉了其他“提示”格式),并且在页面不包含这些提示之一时使用备选算法。

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

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

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


1
如果html页面和图像之间的QvkaduU部分始终相同,您可以进行字符串替换吗?
"http://imgur.com/gallery/QvkaduU".Replace("imgur.com/gallery","i.imgur.com") + ".jpg";

1
我会获取整个HTML源代码,并使用正则表达式将所有<img ... src="...">参数以及< ... style="... background-image: ...;"> css内联属性提取出来,尝试临时下载链接后面的所有文件。然后我会(尝试将其转换为位图并)检查像素大小,最大的图片应该是你想要的图片。
Google可能会帮助您如何检查像素大小并转换任何图像。
从HTML源代码中获取所有图像链接的正则表达式应该是 <img[^>]+src=\"([^"]+)\".*?>|<[^>]+style=\"[^"]*background-image:\s*url\(\s*'?([^')])\s*'?)\s*;.*?>(未经测试,但相当确定)
结果将在第2或第3组索引中,还不要忘记在相对链接上加前缀的当前URL。

不建议使用正则表达式解析HTML,是吗? - algo
@algo 嗯,当我写这个答案的时候,我有30个声望,并且比现在多了9年的经验不足。事情已经改变了,但是当时很多人的心态是不同的。我认为对于非常简单的东西,在HTML上使用正则表达式是可以的,但是我同意,这种情况会极大地受益于利用HTML解析器。接受的答案确实是正确的方法。 - Martin Braun

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

0

1
这将仅下载URL给出的对象。如果它是一个图像,那么它可能会正常工作,但如果它是一个包含多个图像(除了主要大图像)的HTML页面,则很可能会出现问题。 - Banshee

0

你能试试这个吗?

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;
}

如何在Windows Mobile中从URL获取图像到pictureBox?获得


1
这段代码只会下载URL给出的对象,如果是图片则可以正常工作,但如果是HTML页面则无法正常工作。我的问题在于最后一个(包含图片的HTML页面)。 - Banshee

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