Чтение метаданных свойства GifBitmapDecoder ... почему это ноль? - PullRequest
1 голос
/ 01 января 2011

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

  1. Загрузить GIF

    var myGif = new GifBitmapDecoder(uri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);

  2. Получить кадр

    var frame = myGif.Frames[i];

  3. С MSDN: запросы метаданных в формате собственного изображения чтение (ushort)Metadata.GetQuery("/grctlext/Delay"), (ushort)Metadata.GetQuery("/imgdesc/Left"), (ushort)Metadata.GetQuery("/imgdesc/Top")

Но две вещи не работают. Во-первых, свойство Metadata для gif и фрейма всегда равно нулю, даже если я пробую разные анимированные 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 Ответ

3 голосов
/ 04 января 2011

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

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

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

...