2014-04-24 12 views
5

Pracuję nad programem do pobierania zbiorczego, ale niektóre adresy URL nie wysyłają danych poprawnie.C# Pobierz obraz z nieznanego formatu

Na przykład, ta strona: http://i.imgbox.com/absMQK6A.png

w dowolnej przeglądarce internetowej, ta strona pokazuje obraz, ale w moim programie, dziwne pobiera dane. Myślę, że ten adres URL jest fałszywy lub chroniony (nie wiem dobrze HTML.)

BTW, w IE, mogę pobrać ten obraz normalnie prawym kliknięciem i zapisać jako obraz. , więc chcę emulować to zachowanie w moim programie.

Jak mogę to zrobić?

Poniżej znajduje się fragment kodu mojego programu.

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(DownloadAddress); 
if (Proxy != null) 
{ 
    request.Proxy = Proxy; 
} 
if (!string.IsNullOrWhiteSpace(UserAgent)) 
{ 
    request.UserAgent = UserAgent; 
} 

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
Stream downloadHttpStream = response.GetResponseStream(); 
int read = downloadHttpStream.Read(buffer, 0, buffer.Length); 
// output codes 

UserAgent to ciąg znaków zawierający informacje o przeglądarce. , takie jak IE, Firefox itp.

Dzięki.

Odpowiedz

4

Jeśli spojrzeć na pierwsze kilka bajtów danych wrócisz z kodem, można zobaczyć, że zaczyna się od 1F 8B 08. This indicates dane są danymi gzip'd (kodowanie gzip jest częstą rzeczą w Internecie). Możesz dołączyć właściwość AutomaticDecompression, aby utworzyć.Kod netto automatycznie rozpakować te dane i uzyskać ważne PNG (bajty zacząć 89 50 4E 47):

var request = (HttpWebRequest)HttpWebRequest.Create(DownloadAddress); 
request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
+0

Ah! to jest bardzo sprytne! nie wiedziałem, że możesz wykonać automatyczną dekompresję i wypakować png! – Aviatrix

+0

Dziękuję bardzo! – donggas90

0

Nie jestem pewien, czy to jest to, czego chciał, chociaż dać mu spróbować

Image img; 
var request = WebRequest.Create(DownloadAddress); 

using (var response = request.GetResponse()) 
using (var stream = response.GetResponseStream()) 
{ 
    img = Bitmap.FromStream(stream); 
} 

ja nie wiem, czy rzeczywiście chcesz załadować go lub po prostu go pobrać, ale w ten sposób będziesz mogli łatwo sprawdzić, czy jest to wykonalne

img.Save(somePath); 
+0

Dziękuję za odpowiedź. Ale wyrzuć 'ArgumentException' at' img = Bitmap.FromStream (stream); '. – donggas90

0

nie pojawia się obraz, bo to w Base64, z this online converter można wkleić odpowiedź ze strony i przekształcić ją w obrazie tylko dla testu.

Przeglądarki mają wbudowaną obsługę kodowanych obrazów Base64. Są one często używane do osadzania małych ikon w linii, aby uniknąć dodatkowych żądań http.

Ponieważ, jak rozwiązać swój problem:

  1. spróbuj pobrać obraz jako zwykłej
  2. sprawdzić, czy pracował (spróbuj złapać wyjątki i sprawdzić rozmiar)
  3. jeśli istnieją wyjątki staraj się convert it from base64 like this
  4. jeśli to nie zadziała pokazać błąd lub zapisać ścieżkę obrazu gdzieś do wglądu później

Ponadto można dodać obsługę obrazów WebP, ponieważ stają się one coraz bardziej popularne. Jest biblioteka WebP NET on codeplex

+0

Dziękuję za odpowiedź. Właśnie o to chodziło! ale teraz mam problem z zamianą bajtów na ciąg C#. 'b64 = Encoding.ASCII.GetString (pageData.ToArray());' wynik nie jest prawidłowy Base64. – donggas90

+0

@JIH Proszę odnieść się do kodu Tima dla lepszego rozwiązania kodu :) ale powinieneś mieć różne kontrole dla różnych rzeczy :) – Aviatrix

0

Cóż zawsze można pobrać obraz używając

var webClient = new WebClient(); 
byte[] buffer = webClient.DownloadData("http://i.imgbox.com/absMQK6A.png");