У меня есть этот метод, чтобы получить миниатюру изображения на диске:
public static BitmapImage GetThumbnail()
{
var dlg = new OpenFileDialog {Filter = "Imágenes|" + extensionesImagenes};
var result = dlg.ShowDialog();
if (result == true)
{
var tempFolder = Path.GetTempPath() + "MyTempFolder\\";
if (!Directory.Exists(tempFolder))
Directory.CreateDirectory(tempFolder);
using (var thumbnail = new Bitmap(170, 170))
{
using (var gr = Graphics.FromImage(thumbnail))
{
gr.SmoothingMode = SmoothingMode.HighQuality;
gr.InterpolationMode = InterpolationMode.HighQualityBicubic;
gr.PixelOffsetMode = PixelOffsetMode.HighQuality;
gr.DrawImage(new Bitmap(dlg.FileName), new Rectangle(0, 0, 170, 170));
}
thumbnail.Save(tempFolder + "foto.jpg", ImageFormat.Jpeg);
}
return new BitmapImage(new Uri(tempFolder + "foto.jpg"));
}
return null;
}
Если запускаю первый раз, то проблем нет. Но когда я запускаю его во второй раз, я получаю исключение «Произошла общая ошибка в GDI +», потому что файл используется моим приложением.
Метод может вызываться несколько раз в зависимости от действий пользователей, и файл должен быть перезаписан. На самом деле, если файл существует, когда я вызываю метод в первый раз, он успешно перезаписывается.
Файл создается методом Save() класса Bitmap, и я не использую какой-либо поток.
Как я могу разблокировать файл?
ТИА
ИЗМЕНИТЬ
Я не использую MemoryStream, потому что мне нужен файл в другом методе: когда пользователь вызывает метод GetThumbnail, миниатюра будет отображаться в StackPanel (миниатюра — это ImageSource StackPanel.)
Позже пользователь может сохранить в базу данных информацию, показанную в форме WPF, включая изображение, и метод, который сохраняет в базу данных, должен прочитать байты из сохраненного изображения.
ИЗМЕНИТЬ 2
Перед использованием миниатюр я использовал этот метод:
public static BitmapImage GetImage()
{
var dlg = new OpenFileDialog {Filter = "Imágenes|" + extensionesImagenes};
var result = dlg.ShowDialog();
return result == true ? new BitmapImage(new Uri(dlg.FileName)) : null;
}
Это работало нормально.
Теперь, когда я использую эскизы, проблема с MemoryStream заключается в том, что я не могу установить Uri для изображения.
Например, я использовал:
imagenNueva = InterfazUtil.GetImage(); // GetImage() is now GetThumbnail()
var rutaFoto = (imagenNueva != null) ? imagenNueva.ToString() : null;
Строка rutaFoto была передана в метод, сохраняющий информацию в базу данных, и он использует эту переменную для чтения изображения с диска.
В методе GetThumbnail я преобразовал миниатюру изображения в BitmapImage и попытался установить SourceUri и BaseUri с помощью:
новый Uri (диалог.ИмяФайла);
Но когда я вызываю imagenNueva.ToString(), я не получаю действительный Uri.
using(var dlg...
). Я думаю, дело в том, что.Save
не может перезаписывать существующие файлы. - person Sayse   schedule 22.07.2013Clone
тогда, (BitmapImage().Clone()
) - person Sayse   schedule 22.07.2013