2013-03-19 172 views
6

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

是否有任何“简单”的方法来做到这一点,或者我将不得不提取HTML并构造一个C#解析器,它在HTML中查找比所有其他图像更大的图像?

让我明白这一点。例如,如果您将http://imgur.com/gallery/QvkaduU(HTML版本)粘贴到Facebook的状态更新字段中,它会找到主图片并将缩略图从其中删除,这正是我期待的行为。问题是,这是如何完成的?我是否必须编写自己的HTML解析器,或者有没有简单的方法来获取它?

+1

你检查了[他们的API](http://api.imgur.com/)吗? – Filburt 2013-03-19 19:55:58

+0

不,我希望有一个通用的解决方案,不仅仅是imgurl。 – Banshee 2013-03-19 20:04:33

+1

我认为屏幕抓取总是*非常不得已*。在大多数情况下,这样做会违反使用条款。 – Filburt 2013-03-19 23:15:57

回答

4

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

Facebook的算法相当复杂。网页开发者可以通过添加不同的meta标签的<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请求Facebook的给定URL的缩略图。

它提供这样的事情

其他服务包括:

0

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

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

+1

这将只下载对象这个URL给你,如果它的图片只有它可能会工作得很好,但如果它的HTML页面有多个图片(除了主要的大图),这很可能是一个问题。 – Banshee 2013-03-20 15:26:15

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

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

+1

这段代码只会下载url给你的对象,如果它的图片可以工作,但是如果它的HTML页面不起作用的话。我的问题是最后一个(包含图像的HTML页面)。 – Banshee 2013-03-20 15:27:19

1

如果QvkaduU部分始终是HTML页面和图像之间的相同得到,你可以只是做一个字符串替代?

http://imgur.com/gallery/QvkaduU”。替换(“imgur.com/gallery”,“i.imgur.com”)+“.jpg”;

1

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

谷歌可能会帮助你如何检查像素大小和转换任何图像。

正则表达式来获得从HTML源的所有图片链接应该是

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

结果将在第二或第三组索引,也不要忘记将相关链接上的当前网址加上前缀。

1

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