2013-07-26 14 views
11

Dostaję obrazy z URL:Obraz z URL strumienia

BitmapImage image = new BitmapImage(new Uri(article.ImageURL)); 
NLBI.Thumbnail.Source = image; 

Działa to idealny, teraz muszę umieścić ją w strumieniu, aby uczynić go do tablicy bajtów. Robię to:

WriteableBitmap wb = new WriteableBitmap(image); 
     MemoryStream ms = new MemoryStream(); 
     wb.SaveJpeg(ms, image.PixelWidth, image.PixelHeight, 0, 100); 
     byte[] imageBytes = ms.ToArray(); 

i kod nie działa z NullReference, jak to naprawić?

Odpowiedz

13

Dostajesz NullReference wyjątek, ponieważ obraz nadal nie jest ładowany, gdy go używać. Można czekać na zdarzenie ImageOpened, a następnie pracować z nim:

var image = new BitmapImage(new Uri(article.ImageURL));    
image.ImageOpened += (s, e) => 
    { 
     image.CreateOptions = BitmapCreateOptions.None; 
     WriteableBitmap wb = new WriteableBitmap(image); 
     MemoryStream ms = new MemoryStream(); 
     wb.SaveJpeg(ms, image.PixelWidth, image.PixelHeight, 0, 100); 
     byte[] imageBytes = ms.ToArray(); 
    }; 
NLBI.Thumbnail.Source = image; 

Inną opcją jest, aby strumień pliku obrazu bezpośrednio za pomocą WebClient:

WebClient client = new WebClient(); 
client.OpenReadCompleted += (s, e) => 
    { 
     byte[] imageBytes = new byte[e.Result.Length]; 
     e.Result.Read(imageBytes, 0, imageBytes.Length); 

     // Now you can use the returned stream to set the image source too 
     var image = new BitmapImage(); 
     image.SetSource(e.Result); 
     NLBI.Thumbnail.Source = image; 
    }; 
client.OpenReadAsync(new Uri(article.ImageURL)); 
+1

Powinieneś pójść na drugą opcję . Pobierz bufor obrazu za pomocą 'WebClient', jak pokazano powyżej, a następnie zapisz strumień do tablicy bajtów i bezpośrednio stwórz BitmapImage z tego samego strumienia, wywołując [BitmapImage.SetSource] (http://msdn.microsoft.com/ en-us/library/system.windows.media.imaging.bitmapsource.setsource (v = vs.95) .aspx). – Clemens

+0

Mam uzupełnioną odpowiedź z sugestią z @Clemens – anderZubi

24
var webClient = new WebClient(); 
byte[] imageBytes = webClient.DownloadData(article.ImageURL); 
+2

'WebClient.DownloadData' nie jest dostępny w Silverlight. – Clemens

+0

Dzięki, ale dostaję 'Serwer zdalny zwrócił błąd: (404) Nie znaleziono. –

+0

To zadziałało dla mnie dzięki .. –

0

można użyć tego:

private async Task<byte[]> GetImageAsByteArray(string urlImage, string urlBase) 
    { 

     var client = new HttpClient(); 
     client.BaseAddress = new Uri(urlBase); 
     var response = await client.GetAsync(urlImage); 

     return await response.Content.ReadAsByteArrayAsync(); 
    } 
+0

Myślę, że kiedy zadałem pytanie nie było czegoś takiego jak async w Windows Phone 7 :) – Cheese

+0

haha, Myślę, że widziałem twoje pytanie trochę późno – Matsteel

Powiązane problemy