it-swarm.com.ru

Открыть изображение из файла, затем снять блокировку?

Я использую следующую строку кода, чтобы открыть Image из файла:

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

Я ожидаю, что он заблокирует файл, загрузит изображение в память, установит pictureBox1.Image для копии в памяти и снимет блокировку. На самом деле, блокировка не исчезнет, ​​пока я Dispose() из Image в памяти. Я не могу снять блокировку файла на жестком диске, который больше не использую, пока не избавлюсь от файла в памяти , которую я использую .
Сайт Microsoft упоминает об этом в статье на C #, но их решение написано в Visual Basic , что для меня бесполезно.

В итоге: Я хочу установить pictureBox1.Image для изображения, хранящегося в "test.png", а затем позволить пользователю редактировать или удалять "test.png" или что-то еще.

61
Eagle-Eye

Подход с потоком не верен.

Смотрите здесь https://stackoverflow.com/a/8701748/355264

Правильный код сверху ссылка:

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

Или, что еще лучше, используйте оператор using (код ниже скопирован из поста [удаленного] sylon). Таким образом, если Image.FromStream выдает исключение, вы все равно можете быть уверены, что поток немедленно закрыт.

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

Вы также можете использовать поток, чтобы прочитать изображение, а затем закрыть поток.

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

Самый простой способ, который я нашел, - это заморозить объект, содержащий источник (путь к файлу). Кажется, что все элементы управления, которые могут содержать изображение, имеют .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;
    }
2
Rafael Ventura

говорить открыто, читать и выпускать

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

0
psycobot