Ответ 1
Подход с потоком неверен.
См. здесь fooobar.com/questions/121323/...
Исправьте код из приведенной выше ссылки:
Image img;
using (var bmpTemp = new Bitmap("image_file_path"))
{
img = new Bitmap(bmpTemp);
}
Я использую следующую строку кода, чтобы открыть Image
из файла:
pictureBox1.Image = Image.FromFile("test.png");
Я ожидаю, что он заблокирует файл, загрузит изображение в память, установит pictureBox1.Image
в копию в памяти и отпустит блокировку. В действительности блокировка не исчезнет до тех пор, пока я Dispose()
в Image
в памяти. Я не могу освободить блокировку файла на жестком диске, который я больше не использую, пока не избавлюсь от файла в памяти, который я использую.
Сайт Microsoft упоминает его в статье на С#, но их решение написано на визуальном основании, что для меня бесполезно.
Вкратце:
Я хочу установить pictureBox1.Image
на изображение, сохраненное в "test.png"
, затем разрешить пользователю редактировать или удалять "test.png"
или что-то еще.
Подход с потоком неверен.
См. здесь fooobar.com/questions/121323/...
Исправьте код из приведенной выше ссылки:
Image img;
using (var bmpTemp = new Bitmap("image_file_path"))
{
img = new Bitmap(bmpTemp);
}
Или еще лучше, используйте оператор using
(код ниже в противном случае копируется из столбца симона [удалено]). Таким образом, если 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, который, если не null, заблокирует файл, на который указывает.
Теперь трюк заключается в том, чтобы изменить элемент управления "Изображение" в состояние "только для чтения", которое затем разблокирует файл.
Мое решение:
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;`