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