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);
    }
Другие вопросы по тегам