C# BitmapFrame.Thumbnail свойство является нулевым для некоторых изображений
Я пытаюсь изменить этот проект для отображения изображений в каталоге. Но проблема в том, что код не работает для всех изображений, подобных этому. Так что проблема в том,
BitmapFrame bitmapFrame = BitmapFrame.Create(new Uri(path))
Здесь в репозитории свойство BitmapFrame.Thumbnail для некоторых изображений имеет значение null. Я не нахожу ничего о том, что не так с этими изображениями.
Как заставить это работать для всех изображений?
2 ответа
Вы можете использовать следующий метод для создания миниатюр для изображений, у которых их нет.
private BitmapSource CreateThumbnail(string path)
{
BitmapImage bmpImage = new BitmapImage();
bmpImage.BeginInit();
bmpImage.UriSource = new Uri(path);
bmpImage.DecodePixelWidth = 120;
// bmpImage.DecodePixelHeight = 120; // alternatively, but not both
bmpImage.EndInit();
return bmpImage;
}
Я столкнулся с той же проблемой с примером SDK. Некоторые jpg отображаются в виде маленького белого прямоугольника вместо эскиза. Может быть, это результат того, что JPG имеет неподдерживаемый формат или JPG не содержит информации EXIF в заголовке? Я не уверен .. Я мог бы решить это с помощью процедуры, предоставленной Равираджем.
Однако ответ, предоставленный Raviray, немного короток. Миниатюра работает только тогда, когда результат функции передается в конструктор BitmapFrame вашего класса изображения. Класс BitmapFrame имеет конструктор с двумя аргументами для этого, второй — растровое изображение миниатюры, см. Как переопределить (использовать) свойство BitmapFrame.Thumbnail в WPF C#?
У меня получилось работать с «плохими» jpg, изменив Photo.cs в примере SDK следующим образом.
private BitmapSource CreateBitmapSource(Uri path)
{
BitmapImage bmpImage = new BitmapImage();
bmpImage.BeginInit();
bmpImage.UriSource = path;
bmpImage.EndInit();
return bmpImage;
}
private BitmapSource CreateThumbnail(Uri path)
{
BitmapImage bmpImage = new BitmapImage();
bmpImage.BeginInit();
bmpImage.UriSource = path;
bmpImage.DecodePixelWidth = 120;
bmpImage.EndInit();
return bmpImage;
}
// it has to be plugged in here,
public Photo(string path)
{
Source = path;
_source = new Uri(path);
// replaced.. Image = BitmapFrame.Create(_source);
// with this:
Image = BitmapFrame.Create(CreateBitmapSource(_source),CreateThumbnail(_source));
Metadata = new ExifMetadata(_source);
}