Magazine Internet

[WPF] Charger une image sans verrouiller l’originale

Publié le 08 juin 2009 par Jeremy.jeanson

écran d'ordinateur par faustineclavert

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

Retour à La Une de Logo Paperblog

A propos de l’auteur


Jeremy.jeanson 1573 partages Voir son profil
Voir son blog

l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte l'auteur n'a pas encore renseigné son compte

Dossier Paperblog