Bonjour !!
C'est pas vraiment un problème, mais j'ai plutôt besoin d'avis d'experts.
Ce serait trop long expliquer en quoi consiste mon programme, donc je vais vous faire une petite mise en situation bidon.
Je télécharge un favicon d'internet en le sauvegardant dans un fichier .ico. Ensuite je charge ce fichier pour retourner un BitmapImage à l'aide de cette fonction:
Je sauvegarde cette image dans un objet dont je sérialise. Alors je converti mon image en Byte[] à l'aide de cette fonction:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 public static BitmapImage IconFileToBitmap(string path) { Stream iconStream = new FileStream(path, FileMode.Open, FileAccess.Read); IconBitmapDecoder decoder = new IconBitmapDecoder(iconStream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None); PngBitmapEncoder encoder = new PngBitmapEncoder(); MemoryStream memStream = new MemoryStream(); BitmapImage img = new BitmapImage(); encoder.Frames.Add(BitmapFrame.Create(decoder.Frames[0])); encoder.Save(memStream); img.BeginInit(); img.StreamSource = new MemoryStream(memStream.ToArray()); img.EndInit(); memStream.Close(); iconStream.Close(); File.Delete(path); return img; }
Et lorsque je désérialise mon objet, je converti mon image en Byte[] vers une BitmapImage à l'aide de cette dernière fonction:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public static Byte[] BitmapImageToByteStream(BitmapImage img) { MemoryStream stream = new MemoryStream(); PngBitmapEncoder encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(img)); encoder.Save(stream); byte[] bytestream = stream.GetBuffer(); stream.Close(); return bytestream; }
Ce code vient de plusieurs forums que j'ai trouver sur le web dont j'ai adapté à mes besoin, cependant je me demandais s'il y avait du code inutile. Comme exemple, est-ce vraiment nécessaire de Décoder une Byte[] pour ensuite la réencoder?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 public static BitmapImage ByteToBitmapImage(byte[] bytes) { MemoryStream stream = new MemoryStream(bytes); PngBitmapDecoder decoder = new PngBitmapDecoder(stream, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.None); PngBitmapEncoder encoder = new PngBitmapEncoder(); BitmapImage img = new BitmapImage(); MemoryStream tempStream = new MemoryStream(); encoder.Frames.Add(BitmapFrame.Create(decoder.Frames[0])); encoder.Save(tempStream); img.BeginInit(); img.StreamSource = new MemoryStream(tempStream.ToArray()); img.EndInit(); stream.Close(); tempStream.Close(); return img; }
Je cherche plutôt à avoir l'avis de vous pour savoir si je me suis pris de la bonne manière.
Merci!!!
Partager