Открыть изображение из файла, затем снять блокировку? - PullRequest
66 голосов
/ 05 июля 2011

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

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

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

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

Ответы [ 5 ]

82 голосов
/ 02 января 2012

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

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

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

Image img;
using (var bmpTemp = new Bitmap("image_file_path"))
{
    img = new Bitmap(bmpTemp);
}
47 голосов
/ 05 июля 2011

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

using (FileStream stream = new FileStream("test.png", FileMode.Open, FileAccess.Read))
{
    pictureBox1.Image = Image.FromStream(stream);
}
9 голосов
/ 05 июля 2011

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

FileStream stream = new FileStream("test.png", FileMode.Open, FileAccess.Read);
pictureBox1.Image = Image.FromStream(stream);
stream.Close();
2 голосов
/ 07 июня 2016

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

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

    StreamReader streamReader = new StreamReader("picture.png");
    Bitmap tmpBitmap = (Bitmap)Bitmap.FromStream(streamReader.BaseStream);
    streamReader.Close();
    pictureBox1.Image = tmpBitmap;`
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...