Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

См. здесь fooobar.com/questions/121323/...

Исправьте код из приведенной выше ссылки:

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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