C# 从URL到流的图像

C# 从URL到流的图像,c#,silverlight,windows-phone-7,windows-phone-8,C#,Silverlight,Windows Phone 7,Windows Phone 8,我正在从url获取图像: BitmapImage image = new BitmapImage(new Uri(article.ImageURL)); NLBI.Thumbnail.Source = image; 这很好用,现在我需要把它放在一个流中,使它成为字节数组。我正在这样做: WriteableBitmap wb = new WriteableBitmap(image); MemoryStream ms = new MemoryStream(); wb.SaveJpeg(ms, im

我正在从url获取图像:

BitmapImage image = new BitmapImage(new Uri(article.ImageURL));
NLBI.Thumbnail.Source = image;
这很好用,现在我需要把它放在一个流中,使它成为字节数组。我正在这样做:

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

而代码在使用NullReference时失败,如何修复它?

您会得到一个
NullReference
异常,因为使用它时图像仍然没有加载。您可以等待
ImageOpened
事件,然后使用它:

var webClient = new WebClient();
byte[] imageBytes = webClient.DownloadData(article.ImageURL);
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;
其他选项是直接使用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));
您可以使用以下选项:

    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();
    }
private异步任务GetImageAsByteArray(字符串urlImage,字符串urlBase)
{
var client=新的HttpClient();
client.BaseAddress=新Uri(urlBase);
var response=await client.GetAsync(urlImage);
return wait response.Content.ReadAsByteArrayAsync();
}

WebClient.DownloadData
在Silverlight中不可用。谢谢,但是我得到
远程服务器返回了一个错误:(404)找不到。
在c#mvc和.net 4.5.1中为我工作。您应该选择第二个选项。通过如上所示的
WebClient
下载图像缓冲区,然后将流写入字节数组,并通过调用直接从同一流创建BitmapImage。我已经完成了@Clemens的建议回答。我想当我问这个问题时,windows phone 7中没有异步这样的东西:)