Чтение свойств метаданных GifBitmapDecoder... почему это null?

Как я могу прочитать данные задержки, левого и верхнего смещений для каждого кадра gif? Я добрался до этого.

Но две вещи не работают. Сначала свойство Metadata как gif, так и фрейма всегда равно null, даже если я пытаюсь использовать различные анимированные gif файлы. Во-вторых, свойство метаданных фрейма, похоже, не имеет метода GetQuery.

Как запустить эти запросы, что я пропустил?

Edit:

Вот пример кода, который дает мне нулевые метаданные. Используя новую установку VS2010 Premium, в новом приложении WPF. Файл изображения находится в комментариях.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            var uri = new Uri(@"c:\b-414328-animated_gif_.gif");
            var myGif = new GifBitmapDecoder(uri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
            var frame = myGif.Frames[0];

            Title = "";
            Title += "Global Metadata is null: " + (myGif.Metadata == null).ToString();
            Title += "; Frame Metadata is null: " + (frame.Metadata == null).ToString();

            // Crash due to null metadata
            //var frameData = (BitmapMetadata)frame.Metadata;
            //var rate = (ushort)frameData.GetQuery("/grctlext/Delay");

        }
    }
}

Ответ 1

Сначала вам нужно заморозить кадр, из которого вы хотите получить метаданные:

var frame = myGif.Frames[0];
frame.Freeze();

Во-вторых, frame.Metadata возвращает ImageMetadata, который не имеет метода GetQuery, но на самом деле возвращенный объект имеет тип BitmapMetadata, который имеет GetQuery, поэтому вам просто нужно выделить фрейм. Метаданные в BitmapMetadata, как и в последних комментариях вашего кода.