2013-03-19 23 views
6

Mam kod C# do pobierania obrazów z adresów URL takich jak http://i.imgur.com/QvkaduU.jpg, ale w jaki sposób mogę pobrać obraz z takich stron internetowych: http://imgur.com/gallery/QvkaduU?Pobieranie obrazu miniatury ze strony internetowej

Czy jest jakiś "łatwy" sposób to zrobić lub będę musiał pobrać HTML i skonstruować parser C#, który wygląda w HTML dla obrazów, które są większe niż wszystkie inne?

Pozwól, że to wyjaśnię. Jeśli wkleisz http://imgur.com/gallery/QvkaduU (wersja HTML) na przykład w polu aktualizowania stanu Facebooka, znajdzie główny obraz i zrobi z niego miniaturkę, to jest właśnie to zachowanie, którego szukam. Pytanie brzmi: jak to się robi? Czy muszę napisać własny parser HTML lub czy istnieje prosty sposób na uzyskanie tego?

+1

Czy sprawdziłeś [ich API] (http://api.imgur.com/)? – Filburt

+0

nie, miałem nadzieję na ogólne rozwiązanie nie tylko dla imgurl. – Banshee

+1

Myślę, że skrobanie ekranu jest zawsze * ostatecznością *. W większości przypadków będzie to naruszać warunki użytkowania. – Filburt

Odpowiedz

4

Nie ma łatwego sposobu na uzyskanie "dobrej" miniatury dowolnego adresu URL.

Algorytm Facebooka jest dość skomplikowany. programiści stron są w stanie dać mu wskazówkę dodając różne znaczniki meta do <head>, w tym:

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

lub

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

(more on this)

... więc jeśli chciał zreplikować algorytm Facebooka, musisz pobrać źródło strony, przeanalizować je pod kątem "podpowiedzi" podobnych do powyższej (lepiej sprawdź, czy nie pominięto żadnego innego "podpowiedzi") i wymyślić algorytm, jeśli strona nie zawiera jednego z nich .

Bardziej realistycznym rozwiązaniem byłoby użycie cudzego URL-a -> systemu miniatur.

Jeśli podoba Ci się wersja Facebooka, myślę, że powinieneś być w stanie poprosić o miniaturkę Facebooka dla danego adresu URL za pośrednictwem interfejsu API.

Inne usługi, które oferują tego rodzaju rzeczy są:

0

Czy możesz spróbować czegoś takiego?

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

Możesz także wypróbować, o czym tu mówią. Wypróbowałem to i zadziałało jak urok.

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

+1

To spowoduje tylko pobranie obiektu podany adres URL, jeśli jest to tylko obraz, prawdopodobnie będzie działał dobrze, ale jeśli jest to strona HTML z wieloma obrazami (oprócz głównego dużego obrazu), najprawdopodobniej wystąpi problem. – Banshee

0

można spróbować to

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

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

+1

Ten kod pobierze tylko obiekt udostępniony przez adres URL, jeśli jego obraz będzie działał, ale jeśli strona HTML nie będzie działać. Mój problem jest ostatni (strona HTML zawierająca obrazy). – Banshee

1

Chciałbym sprowadzić całe źródło HTML i wszystkie parametry <img ... src="...">, jak również < ... style="... background-image: ...;"> css właściwości inline za pomocą regex i d spróbuj pobrać wszystkie pliki znajdujące się za linkami tymczasowymi. Potem chciałbym (spróbować przekonwertować go na Bitmapę i) sprawdzić rozmiar piksela, największy obrazek powinien być obrazem, który chcesz.

Google może pomóc w sprawdzeniu rozmiaru pikseli i przekonwertowaniu dowolnych obrazów.

regex, aby uzyskać wszystkie linki obraz ze źródła HTML powinien być

<img[^>]+src=\"([^"]+)\".*?>|<[^>]+style=\"[^"]*background-image:\s*url\(\s*'?([^')])\s*'?)\s*;.*?> (nie testowane, ale całkiem pewny)

Wynik będzie w 2. lub 3. indeksu grupowego, również nie zapomnieć o przedrostku bieżącego adresu URL na odnośnych linkach.

1

Jesteś już na dobrej drodze, tak, najbardziej niezawodnym sposobem byłoby pobranie kodu HTML, przeanalizowanie go i poszukiwanie obrazów, a następnie uszeregowanie obrazów na podstawie pozycji i rozmiaru. Na przykład, jeśli pierwszy znaleziony obraz jest wystarczająco duży, aby utworzyć miniaturę, a następnie ostudzić, jeśli jest mały, przejdziesz do następnego obrazu itp. Najlepiej byłoby użyć wtyczki graficznej, takiej jak Timthumb (myślę, że Widziałem kiedyś wersję ASP.NET) i buforowałem obrazy tak, że gdy już spojrzysz na miniaturę, aby reprezentować stronę internetową, możesz zamiast tego wywołać obraz (y) z haczyka.

Powiązane problemy