web-dev-qa-db-fra.com

Open Image from file, puis relâchez le verrou?

J'utilise la ligne de code suivante pour ouvrir une Image à partir d'un fichier:

pictureBox1.Image = Image.FromFile("test.png");

Je m'attends à ce qu'il verrouille le fichier, charge l'image en mémoire, définisse pictureBox1.Image sur la copie en mémoire et libère le verrou. En réalité, le verrou ne disparaîtra pas avant que je Dispose() de Image en mémoire. Je ne peux pas libérer le verrou du fichier sur le disque dur que je n'utilise plus tant que je ne me suis pas débarrassé du fichier dans memory que je suis using.
Le site de Microsoft le mentionne dans un article portant une étiquette C #, mais leur solution est écrite dans visual basic , ce qui m'est inutile.

En résumé: Je veux définir pictureBox1.Image sur l'image stockée dans "test.png", puis laisser l'utilisateur éditer ou supprimer "test.png" ou peu importe.

61
Eagle-Eye

L'approche avec le flux n'est pas correcte.

Voir ici https://stackoverflow.com/a/8701748/355264

Code correct du lien ci-dessus:

Image img;
using (var bmpTemp = new Bitmap("image_file_path"))
{
    img = new Bitmap(bmpTemp);
}
74
net_prog

Ou mieux encore, utilisez une instruction using (le code ci-dessous est par ailleurs copié du message [supprimé] de sylon). De cette façon, si le Image.FromStream lève une exception, vous pouvez toujours être assuré que le flux est immédiatement fermé.

using (FileStream stream = new FileStream("test.png", FileMode.Open, FileAccess.Read))
{
    pictureBox1.Image = Image.FromStream(stream);
}
47
JoshL

Vous pouvez également utiliser un flux pour lire l'image, puis le fermer.

FileStream stream = new FileStream("test.png", FileMode.Open, FileAccess.Read);
pictureBox1.Image = Image.FromStream(stream);
stream.Close();
9
lahsrah

Le moyen le plus simple que j'ai trouvé consiste à geler l'objet contenant la source (chemin d'accès au fichier). Tous les contrôles pouvant contenir une image semblent avoir un fichier .Source qui, s'il n'est pas nul, verrouille le fichier sur lequel il pointe.

Maintenant, l'astuce consiste à changer le contrôle Image en un état "lecture seule", ce qui déverrouille ensuite le fichier.

Ma solution:

    private Image CreatePreviewImage()
    {
        Image ReportImage = new Image();
        Uri path = new Uri(@"C:\Folder\Image1.png");
        if (File.Exists(path.OriginalString))
        {
            ReportImage.Name = "Report1";
            ReportImage.Source = LoadImageFromFile(path);
        }
        return ReportImage;
    }

    public ImageSource LoadImageFromFile(Uri path)
    {
        BitmapImage bitmap = new BitmapImage();
        bitmap.BeginInit();
        bitmap.UriSource = path;
        bitmap.CacheOption = BitmapCacheOption.OnLoad;
        bitmap.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
        bitmap.DecodePixelWidth = 900;
        bitmap.EndInit();
        bitmap.Freeze(); //This is the magic line that releases/unlocks the file.
        return bitmap;
    }
2
Rafael Ventura

parler ouvertement, lire et relâcher

 StreamReader streamReader = new StreamReader ("picture.png"); 
 Bitmap tmpBitmap = (Bitmap) Bitmap.FromStream (streamReader.BaseStream); 
 streamReader.Close (); 
 pictureBox1.Image = tmpBitmap; `
 

0
psycobot