2011-01-01 5 views
1

Wie kann ich die Verzögerung, links und oben Offset-Daten für jeden Rahmen eines Gif lesen? Ich bin soweit gekommen.Lesen der Metadaten-Eigenschaft von GifBitmapDecoder ... warum ist es null?

  1. laden Gif

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

  2. Erhalten Sie einen Rahmen

    var frame = myGif.Frames[i];

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

Aber zwei Dinge funktionieren nicht. Erstens ist die Metadaten-Eigenschaft sowohl des Gif als auch des Rahmens immer Null, selbst wenn ich verschiedene animierte Gif-Dateien versuche. Zweitens scheint die Metadata-Eigenschaft des Frames keine GetQuery-Methode zu haben.

Wie führe ich diese Abfragen, was habe ich vermisst?

Edit:

Hier ist Beispielcode, der mich null Metadaten gibt. Verwenden einer Neuinstallation von VS2010 Premium auf einer neuen WPF-Anwendung. Die Bilddatei ist diejenige in den Kommentaren.

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

     } 
    } 
} 
+0

Aus den Ergebnissen für "animiertes Bild" auf Google, http://en.loadtr.com/animated_gif_-414328.htm. Das Laden dieser und der Metadaten ist bei myGif und allen Frames null. – David

Antwort

3

Zuerst müssen Sie den Rahmen Freeze Sie die Metadaten aus erhalten möchten:

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

Zweitens gibt die frame.Metadata eine ImageMetadata, die keine GetQuery Methode hat, aber in der Tat Das zurückgegebene Objekt ist vom Typ BitmapMetadata, das über eine GetQuery-Methode verfügt. Sie müssen also frame.Metadata wie in den letzten kommentierten Zeilen Ihres Codes in BitmapMetadata umwandeln.

+0

Kleines Update: 'var Verzögerung = (UInt16) ((BitmapMetadata) frame.Metadata) .GetQuery ("/Grctlext/Delay ") * 10; // Milliseconds' – lindexi