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

Dossier Paperblog