读取GifBitmapDecoder的Metadata属性...为什么它为null?

时间:2011-01-01 18:54:54

标签: wpf .net-4.0 animated-gif

如何读取gif每帧的延迟,左和上偏移数据?我已经走到了这一步。

  1. 加载Gif

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

  2. 获取框架

    var frame = myGif.Frames[i];

  3. 来自MSDN: Native Image Format Metadata Queries阅读(ushort)Metadata.GetQuery("/grctlext/Delay")(ushort)Metadata.GetQuery("/imgdesc/Left")(ushort)Metadata.GetQuery("/imgdesc/Top")

  4. 但有两件事不行。首先,即使我尝试使用不同的动画gif文件,gif和frame的Metadata属性也始终为null。其次,框架的Metadata属性似乎没有GetQuery方法。

    如何运行这些查询,我错过了什么?

    编辑:

    以下是为我提供空元数据的示例代码。在全新的WPF应用程序上使用全新安装的VS2010 Premium。图像文件是评论中的文件。

    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 个答案:

答案 0 :(得分:3)

首先,您需要Freeze要从以下位置获取元数据的帧:

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

其次,frame.Metadata返回一个ImageMetadata,它没有GetQuery方法,但实际上返回的对象是BitmapMetadata类型,它有GetQuery方法,所以你只需要像你在代码的最后一个注释行中那样将frame.Metadata转换为BitmapMetadata。