Как переопределить (использовать) свойство BitmapFrame.Thumbnail в WPF C#?
Здравствуйте! Проблема в? что у меня есть многостраничный файл Tiff для отображения, и я использую свойство BitmapFrame.Thumbnail, чтобы отобразить уменьшенное изображение каждого кадра (страницы) моего многостраничного файла Tiff. Но<по какой-то причине? свойство возвращает ноль. Пожалуйста, дайте пошаговое описание, как это сделать?
Я уже пытался создать свой собственный эскиз BitmapSource с помощью этого метода:
public static BitmapImage GetThumbnail(BitmapFrame bitmapFrame)
{
try
{
JpegBitmapEncoder encoder = new JpegBitmapEncoder();
MemoryStream memorystream = new MemoryStream();
BitmapImage tmpImage = new BitmapImage();
encoder.Frames.Add(bitmapFrame);
encoder.Save(memorystream);
tmpImage.BeginInit();
tmpImage.CacheOption = BitmapCacheOption.OnLoad;
tmpImage.StreamSource = new MemoryStream(memorystream.ToArray());
File.WriteAllBytes( $"{Path.GetTempFileName()}.jpg", memorystream.ToArray());
tmpImage.UriSource = new Uri($"{Path.GetTempFileName()}.jpg");
tmpImage.DecodePixelWidth = 80;
tmpImage.DecodePixelHeight = 120;
tmpImage.EndInit();
memorystream.Close();
return tmpImage;
}
catch (Exception ex)
{
return null;
throw ex;
}
}
затем я преобразовываю результат в BitmapSource и создаю список BitmapFrames, используя:
List<BitmapFrame> tiffImageList = new List<BitmapFrame>();
tiffImageList.Add(new TiffImage() { index = imageIndex, image = BitmapFrame.Create(frame, (BitmapSource)GetThumbnail(frame))});
В конце я пытаюсь получить свойство, но оно возвращает ноль:
foreach (var tiffImage in tiffImageList)
{
Image image = new Image();
image.Source = tiffImage.image.Thumbnail;
}
1 ответ
Я столкнулся с аналогичной проблемой, модифицировав пример SDK PhotoViewerDemo. Некоторые допустимые файлы jpg отображаются в виде миниатюр белого квадрата.
Кажется, я нашел, почему код вопроса не работает. Вопрос Ивана предоставляет правильный конструктор BitmapFrame, но функции должны создавать BitmapSource, а не BitmapImage.
Свойство C# BitmapFrame.Thumbnail имеет значение null для некоторых изображений
Я заставил его работать с функцией, предоставленной в этом разделе, используя вызов Ивана к конструктору, используя два аргумента источника растрового изображения.
Код в примере 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);
}