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

Я использую следующую строку кода, чтобы открыть 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;`
    

Другие вопросы по тегам