Czy istnieje sposób na pobranie obrazu bezpośrednio z adresu URL w języku C #, jeśli adres URL nie ma formatu obrazu na końcu linku? Przykład adresu URL:
https://fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-xpf1/v/t34.0-12/10555140_10201501435212873_1318258071_n.jpg?oh=97ebc03895b7acee9aebbde7d6b002bf&oe=53C9ABB0&__gda__=1405685729_110e04e71d969d392b63b27ec4f4b24a
Wiem, jak pobrać obraz, gdy adres URL kończy się formatem obrazu. Na przykład:
http://img1.wikia.nocookie.net/__cb20101219155130/uncyclopedia/images/7/70/Facebooklogin.png
W zależności od tego, czy znasz format obrazu, czy nie, oto sposoby na zrobienie tego:
Pobierz obraz do pliku, znając format obrazu
Pobierz obraz do pliku bez znajomości formatu obrazu
Możesz użyć
Image.FromStream
do załadowania dowolnego rodzaju zwykłych bitmap (jpg, png, bmp, gif, ...), automatycznie wykryje typ pliku i nie musisz nawet sprawdzać rozszerzenia adresu URL (co nie jest zbyt dobre ćwiczyć). Na przykład:Uwaga: ArgumentException może zostać zgłoszony przez
Image.FromStream
jeśli pobrana zawartość nie jest znanym typem obrazu.Sprawdź to odniesienie w witrynie MSDN, aby znaleźć wszystkie dostępne formaty. Oto odniesienie do
WebClient
iBitmap
.źródło
webClient.ResponseHeaders["Content-Type"]
Dla każdego, kto chce pobrać obraz BEZ zapisywania go do pliku:
źródło
Nie jest konieczne użycie,
System.Drawing
aby znaleźć format obrazu w identyfikatorze URI.System.Drawing
nie jest dostępny,.NET Core
chyba że pobierzesz pakiet System.Drawing.Common NuGet i dlatego nie widzę żadnych dobrych odpowiedzi na to pytanie dla wielu platform.Ponadto mój przykład nie używa,
System.Net.WebClient
ponieważ Microsoft wyraźnie odradza używanieSystem.Net.WebClient
.Pobierz obraz i zapisz go do pliku bez znajomości rozszerzenia (wiele platform) *
* Bez starych
System.Net.WebClient
iSystem.Drawing
.Ta metoda asynchronicznie pobierze obraz (lub dowolny plik, o ile identyfikator URI ma rozszerzenie pliku) przy użyciu rozszerzenia,
System.Net.Http.HttpClient
a następnie zapisze go w pliku, używając tego samego rozszerzenia pliku, co obraz w identyfikatorze URI.Pobieranie rozszerzenia pliku
Pierwszą częścią uzyskiwania rozszerzenia pliku jest usunięcie wszystkich niepotrzebnych części z identyfikatora URI.
Używamy Uri.GetLeftPart () z UriPartial.Path dostać wszystko od
Scheme
góry doPath
.Innymi słowy,
https://www.example.com/image.png?query&with.dots
staje sięhttps://www.example.com/image.png
.Następnie używamy Path.GetExtension (), aby uzyskać tylko rozszerzenie (w moim poprzednim przykładzie
.png
).Pobieranie obrazu
Stąd powinno być prosto. Pobierz obraz za pomocą HttpClient.GetByteArrayAsync , utwórz ścieżkę, upewnij się, że katalog istnieje, a następnie zapisz bajty w ścieżce za pomocą File.WriteAllBytesAsync () (lub
File.WriteAllBytes
jeśli korzystasz z .NET Framework)Zauważ, że potrzebujesz następujących dyrektyw using.
Przykładowe użycie
Uwagi
HttpClient
dla każdego wywołania metody jest złą praktyką . Powinien być ponownie używany w całej aplikacji. Napisałem krótki przykładImageDownloader
(50 wierszy) z większą dokumentacją, która poprawnie ponownie wykorzystujeHttpClient
i prawidłowo usuwa, którą można znaleźć tutaj .źródło
.net Framework umożliwia kontrolce PictureBox ładowanie obrazów z adresu URL
i zapisz obraz w Laod Complete Event
źródło
Spróbuj to zadziałało dla mnie
Napisz to w swoim kontrolerze
Oto mój pogląd
źródło
Większość znalezionych postów przekroczy limit czasu po drugiej iteracji. Szczególnie jeśli przeglądasz kilka obrazów, tak jak ja. Tak więc, aby poprawić powyższe sugestie, jest cała metoda:
źródło