2013-03-19 165 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版本),並緩存圖像,這樣一旦您查看了縮略圖來表示網站,就可以調用捕獲的圖像。