#c# #wpf #uri
#c# #wpf #uri
Вопрос:
Я использую WPF / C # в VS2017. Мой код принимает путь к файлу изображения в виде строки и пытается загрузить его в BitmapFrame, который в основном работал нормально, за исключением того, что кто-то тестировал его с некоторыми файлами изображений с Mac, и это вызвало исключение. Оказывается, что имя файла содержит символ #F025, который в Windows отображается просто как толстая точка.
Файлы представляют собой фотографии, названные по названию фотографии. В этом был вопросительный знак, но в итоге получилось #F025.
В любом случае, код преобразует строку в Uri, а затем использует BitmapFrame следующим образом:
public new void Init()
{
Source = new Uri(Path);
fi = new FileInfo(Path);
BitmapImage bs;
try
{
Image = BitmapFrame.Create(Source);
Metadata = new ExifMetadata(Image);
}
catch (Exception e)
{
Error = e.Message;
IsBroken = true;
}
Когда я смотрю на Uri «Source» в отладчике, символ # F025 заменяется на «%EF%80%A5». Функция Create выдает исключение «Файл не найден».
Есть ли какой-либо способ преобразовать это в Uri, который примет функция Create, или, возможно, просто использовать строковый путь для его загрузки вместо этого? Я пытался использовать поток с именем файла, но это тоже не сработало.
TIA.
Ответ №1:
Вы можете попытаться создать BitmapFrame из FileStream. Обратите внимание, что BitmapCacheOption.OnLoad
должно быть установлено, чтобы иметь возможность закрыть поток сразу после вызова Create.
using (var stream = File.OpenRead(Path))
{
Image = BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);
}
Комментарии:
1. Большое спасибо, это сработало. Мне пришлось изменить это в нескольких других местах, но сейчас все работает отлично.