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?
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));
var webClient = new WebClient();
byte[] imageBytes = webClient.DownloadData(article.ImageURL);
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();
}