2013-07-26 11 views
11

Ich erhalte Bilder von einer URL zu streamen:Bild von URL

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

Das funktioniert perfekt, jetzt muß ich es in einem Strom setzen, es in Byte-Array zu machen. Ich tue dies:

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

Und Code nicht mit Nullreference, wie man es beheben?

Antwort

13

Sie erhalten eine NullReference Ausnahme, weil das Bild immer noch nicht geladen wird, wenn Sie es verwenden. Sie können auf die ImageOpened Ereignis warten, und dann mit ihm arbeiten:

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; 

Andere Möglichkeit ist, den Strom der Bilddatei mit WebClient direkt zu erhalten:

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

Sie sollten für die zweite Option gehen . Laden Sie den Image Buffer wie oben gezeigt mit einem 'WebClient' herunter, schreiben Sie dann den Stream in ein Byte-Array und erstellen Sie das BitmapImage direkt aus demselben Stream durch Aufruf von [BitmapImage.SetSource] (http://msdn.microsoft.com/) de-de/library/system.windows.media.imaging.bitmapsource.setsource (v = vs.95) .aspx). – Clemens

+0

Ich habe die Antwort mit einem Vorschlag von @Clemens – anderZubi

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

'WebClient.DownloadData' ist in Silverlight nicht verfügbar. – Clemens

+0

Danke, aber ich bekomme 'Der Remote-Server gab einen Fehler zurück: (404) Nicht gefunden. –

+0

Das hat für mich funktioniert .. –

0

Sie können dies verwenden:

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

abgeschlossen Ich denke, als ich die Frage gestellt, gab es keine solche async in Windows Phone 7 :) – Cheese

+0

haha, Ich glaube, ich sah Ihre Frage ein bisschen spät – Matsteel