web-dev-qa-db-fra.com

Image de l'URL à diffuser

Je reçois des images à partir d'une URL:

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

Cela fonctionne parfaitement, maintenant je dois le mettre dans un flux, pour le transformer en tableau d'octets. Je fais ça:

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

Et le code échoue avec NullReference, comment le réparer?

12
Cheese

Vous obtenez une exception NullReference car l'image n'est toujours pas chargée lorsque vous l'utilisez. Vous pouvez attendre l'événement ImageOpened, puis l'utiliser avec:

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;

Une autre option consiste à obtenir le flux du fichier image directement à l'aide de 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));
15
anderZubi
var webClient = new WebClient();
byte[] imageBytes = webClient.DownloadData(article.ImageURL);
27
Ashok Damani

vous pouvez utiliser ceci:

    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
Matsteel