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.
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);
}
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);
}
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();
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;
}
parler ouvertement, lire et relâcher
StreamReader streamReader = new StreamReader ("picture.png"); Bitmap tmpBitmap = (Bitmap) Bitmap.FromStream (streamReader.BaseStream); streamReader.Close (); pictureBox1.Image = tmpBitmap; `