
Crédit image : faustineclavert/flickr
Par défaut si vous chargez une image dans un ImageSource pour WPF vous verrouillez le fichier original (impossible de le modifier, renommer ou de la supprimer). Pour remédier à cela il faut faire une copie des donnée en mémoire et ensuite fournir cette copie à notre ImageSource. Et là rien ne vaudra jamais la bonne vieille Stream :
Vb
Private Function GetImageSource(ByVal path As String) As ImageSource ' Ouverture d'une stream vers le fichier original Dim reader As New StreamReader(path) ' Préparation d'un tableau de Byte pour lire la stream Dim length As Int32 = Convert.ToInt32(reader.BaseStream.Length) Dim data(length) As Byte ' Lecture de la stream reader.BaseStream.Read(data, 0, length) ' Création d'une nouvelle stream mémoire ' afin de copier le contenu de la stream originale Dim stream As New MemoryStream(data) ' Création de l'image à parir de la stream en mémoire Dim image As New BitmapImage() image.BeginInit() image.StreamSource = stream image.EndInit() reader.Close() ' Libération des ressources reader.Dispose() reader = Nothing data = Nothing stream = Nothing Return image End Function
C#
private ImageSource GetImageSource(String path)
{
// Ouverture d'une stream vers le fichier original
StreamReader reader = new StreamReader(path);
// Préparation d'un tableau de Byte pour lire la stream
Int32 length = Convert.ToInt32(reader.BaseStream.Length);
Byte[] data = new Byte[length];
// Lecture de la stream
reader.BaseStream.Read(data, 0, length);
// Création d'une nouvelle stream mémoire
// afin de copier le contenu de la stream originale
MemoryStream stream = new MemoryStream(data);
// Création de l'image à parir de la stream en mémoire
BitmapImage image = new BitmapImage();
image.BeginInit();
image.StreamSource = stream;
image.EndInit();
reader.Close();
// Libération des ressources
reader.Dispose();
reader = null;
data = null;
stream = null;
return image;
}
