如何读取 gif 每一帧的延迟、左侧和顶部偏移数据?我已经走到这一步了。
-
加载 GIF 动图
var myGif = new GifBitmapDecoder(uri, BitmapCreateOptions.PreservePixelFormat, BitmapCacheOption.OnLoad);
-
获取一个框架
var frame = myGif.Frames[i];
From MSDN:本机图像格式元数据查询 read (ushort)Metadata.GetQuery("/grctlext/Delay")
, (ushort)Metadata.GetQuery("/imgdesc/Left")
, (ushort)Metadata.GetQuery("/imgdesc/Top")
但有两件事不起作用。首先,即使我尝试不同的动画 gif 文件,gif 和框架的元数据属性也始终为空。其次,框架的 Metadata 属性似乎没有 GetQuery 方法。
我如何运行这些查询,我错过了什么?
Edit:
这是为我提供空元数据的示例代码。在全新的 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");
}
}
}
首先,您需要Freeze您想要从中获取元数据的框架:
var frame = myGif.Frames[0];
frame.Freeze();
其次,frame.Metadata 返回一个图像元数据它没有 GetQuery 方法,但实际上返回的对象是类型位图元数据其中有一个GetQuery方法,因此您只需将 frame.Metadata 转换为 BitmapMetadata,就像在代码的最后注释行中所做的那样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)