2013-07-26 36 views
11

tôi nhận được hình ảnh từ một url:hình ảnh từ URL để dòng

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

này hoạt động hoàn hảo, bây giờ tôi cần phải đặt nó trong một dòng suối, để làm cho nó vào mảng byte. Tôi đang làm điều này:

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

Và mã không thành công với NullReference, cách khắc phục?

Trả lời

13

Bạn nhận được NullReference ngoại lệ vì hình ảnh vẫn không được tải khi bạn sử dụng. Bạn có thể chờ sự kiện ImageOpened, và sau đó làm việc với nó:

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; 

tùy chọn khác là để có được những dòng của tập tin hình ảnh trực tiếp sử dụng 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

Bạn nên chọn tùy chọn thứ hai . Tải xuống bộ đệm hình ảnh bằng phương tiện của 'WebClient' như được hiển thị ở trên, sau đó ghi luồng vào một mảng byte và trực tiếp tạo BitmapImage từ cùng một luồng bằng cách gọi [BitmapImage.SetSource] (http://msdn.microsoft.com/ en-us/library/system.windows.media.imaging.bitmapsource.setsource (v = vs.95) .aspx). – Clemens

+0

Tôi đã hoàn thành câu trả lời với gợi ý từ @Clemens – anderZubi

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

'WebClient.DownloadData' không có trong Silverlight. – Clemens

+0

Cảm ơn, nhưng tôi nhận được 'Máy chủ từ xa đã trả về lỗi: (404) Không tìm thấy.' –

+0

Điều đó làm việc cho tôi nhờ .. –

0

bạn có thể sử dụng này:

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

Tôi nghĩ rằng khi tôi hỏi câu hỏi không có điều như async trong windows phone 7 :) – Cheese

+0

haha, Tôi nghĩ rằng tôi đã thấy câu hỏi của bạn một chút muộn – Matsteel

Các vấn đề liên quan