正在读取 GifBitmapDecoder 的 Metadata 属性...为什么它为空?

发布于 2024-10-09 19:14:25 字数 2061 浏览 0 评论 0 原文

如何读取 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")

但有两件事不起作用。首先,即使我尝试不同的动画 gif 文件,gif 和框架的元数据属性也始终为 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");

        }
    }
}

How can I read the delay, left and top offset data for each frame of a gif? I've gotten this far.

  1. Load the Gif

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

  2. Get a frame

    var frame = myGif.Frames[i];

  3. From MSDN: Native Image Format Metadata Queries read (ushort)Metadata.GetQuery("/grctlext/Delay"), (ushort)Metadata.GetQuery("/imgdesc/Left"), (ushort)Metadata.GetQuery("/imgdesc/Top")

But two things don't work. First the Metadata property of both the gif and the frame are always null, even if I try different animated gif files. Second, the Metadata property of the frame doesn't seem to have a GetQuery method.

How do I run these queries, what did I miss?

Edit:

Here is sample code that gives me null metadata. Using a fresh install of VS2010 Premium, on a fresh WPF application. The image file is the one in the comments.

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");

        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

千笙结 2024-10-16 19:14:25

首先,您需要冻结要从中获取元数据的框架:

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

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

First, you need to Freeze the Frame you want to obtain the metadata from:

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

Second, the frame.Metadata returns an ImageMetadata which does not have a GetQuery method, but in fact the object returned is of type BitmapMetadata which has a GetQuery method, so you just need to cast frame.Metadata to BitmapMetadata as you do in the last commented lines of your code.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文