WPF: Как я могу использовать картинку, пока я ее показываю? - PullRequest
2 голосов
/ 31 декабря 2010

Я пытаюсь это сделать, но программа выдает это исключение:

Произошло необработанное исключение типа 'System.IO.IOException' в mscorlib.dll

Дополнительная информацияпроцесс не может получить доступ к файлу 'C: \ Users \ Roy \ documents \ visual studio 2010 \ Projects \ Assignment3 \ Assignment3 \ bin \ Debug \ Images \ Chrysanthemum.jpg', так как он используется другим процессом.Есть ли способ использовать его, пока он открыт?

код:

if (imgAddMessage.Source != null)
            {
                BitmapImage src = (BitmapImage)imgAddMessage.Source;
                if (!Directory.Exists("Images"))
                {
                    Directory.CreateDirectory("Images");
                }

                FileStream stream = new FileStream("Images/" + imageName, FileMode.Create, FileAccess.ReadWrite);
                JpegBitmapEncoder encoder = new JpegBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(src));
                encoder.Save(stream);
                stream.Close();
            }

Ответы [ 2 ]

1 голос
/ 09 января 2011

Две вещи.

1) Ваш опубликованный код не имеет оператора использования для FileStream и не вызывает для него Dispose.

2) Какой бы фрагмент кода не отображалсякартинка, которую вы пытаетесь сохранить, должна использовать FileAccess.Read, поскольку только один фрагмент кода может удерживать блокировку записи в файле.Еще лучше, если это ваша собственная программа, которая показывает файл, просто кэшируйте изображение в память и показывайте изображение на основе байтов в памяти.Тогда вы не будете удерживать файл и сможете позже делать с ним все, что захотите ...

0 голосов
/ 18 января 2012

Просто любопытно, если у вас все еще есть проблемы.
Вы пробовали следующее?

if (imgAddMessage.Source != null)
{
    string imageDirectory = "pack://application:,,,/Images";
    BitmapImage src = (BitmapImage)imgAddMessage.Source;
    if (!Directory.Exists(imageDirectory))
        Directory.CreateDirectory(imageDirectory);

    using (FileStream stream = new FileStream(Path.Combine(imageDirectory, imageName), FileMode.Create, FileAccess.ReadWrite))
    {
        JpegBitmapEncoder encoder = new JpegBitmapEncoder();
        encoder.Frames.Add(BitmapFrame.Create(src));
        encoder.Save(stream);
    }
}

И, как сказал @Marco, у вас должно быть разрешение на чтение / запись

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...