Как переопределить (использовать) свойство 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);
    }
Другие вопросы по тегам