Открыть изображение из файла, затем снять блокировку?
Я использую следующую строку кода, чтобы открыть Image
из файла:
pictureBox1.Image = Image.FromFile("test.png");
Я ожидаю, что он заблокирует файл, загрузит изображение в память, установит pictureBox1.Image
скопировать в память и снять блокировку. На самом деле замок не уйдет, пока я Dispose()
из Image
в памяти. Я не могу снять блокировку файла на жестком диске, который я больше не использую, пока не избавлюсь от файла в памяти, которую я использую.
Сайт Microsoft упоминает об этом в статье на C#, но их решение написано на Visual Basic, что для меня бесполезно.
В итоге: я хочу установить pictureBox1.Image
к изображению, хранящемуся в "test.png"
, затем позвольте пользователю редактировать или удалять "test.png"
или что угодно.
5 ответов
Подход с потоком не является правильным.
Смотрите здесь /questions/31245682/besplatnyij-fajl-zablokirovan-novyim-rastrovyim-izobrazheniem-filepath/31245702#31245702
Правильный код сверху ссылка:
Image img;
using (var bmpTemp = new Bitmap("image_file_path"))
{
img = new Bitmap(bmpTemp);
}
Или еще лучше, используйте using
заявление (код ниже скопирован с поста [удалено] sylon). Таким образом, если Image.FromStream
выдает исключение, вы все равно можете быть уверены, что поток немедленно закрыт.
using (FileStream stream = new FileStream("test.png", FileMode.Open, FileAccess.Read))
{
pictureBox1.Image = Image.FromStream(stream);
}
Вы также можете использовать поток, чтобы прочитать изображение, а затем закрыть поток.
FileStream stream = new FileStream("test.png", FileMode.Open, FileAccess.Read);
pictureBox1.Image = Image.FromStream(stream);
stream.Close();
Самый простой способ, который я нашел, - это заморозить объект, содержащий источник (путь к файлу). Кажется, что все элементы управления, которые могут содержать изображение, имеют.Source, который, если не ноль, заблокирует файл, на который он указывает.
Теперь хитрость заключается в том, чтобы перевести элемент управления Image в состояние "только для чтения", после чего файл разблокируется.
Мое решение:
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;
}
Говорить открыто, читать и выпускать
StreamReader streamReader = new StreamReader("picture.png"); Bitmap tmpBitmap = (Bitmap)Bitmap.FromStream(streamReader.BaseStream); streamReader.Close(); pictureBox1.Image = tmpBitmap;`