从URL转换成流的图像

18

我正在从一个 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 错误,如何修复?

3个回答

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

2
在Silverlight中不可用的是WebClient.DownloadData - Clemens
谢谢,但我收到了“远程服务器返回错误:(404)未找到。” - Pranav Bilurkar
在我的C# MVC项目中,使用.NET 4.5.1可以正常工作。 - Sr.PEDRO

16

当您使用图像时,由于图像尚未加载,因此会出现NullReference异常。 您可以等待ImageOpened事件,然后使用它:

您可以等待ImageOpened事件,然后使用它,这样就不会在图像尚未加载完成时出现NullReference异常:

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));

1
你应该选择第二个选项。通过WebClient下载图像缓冲区,然后将流写入字节数组,并通过调用BitmapImage.SetSource直接从相同的流创建BitmapImage。 - Clemens
我已经根据@Clemens的建议完成了答案。 - anderZubi

2
您可以使用以下内容:
    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();
    }

我认为当我提出这个问题时,Windows Phone 7 中还没有异步的概念 :) - Developer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接