Kürzlich habe ich versucht, eine andere SO question über das Laden der Frames (Bitmap und Dauer) von animierten GIFs
zu beantworten. Der Code kann auf pastenbin gefunden werden. dabei zusätzliche Tests auf diesem CodeMonoMac System.Drawing.Image.GetPropertyItem (0x5100)
Während bevor sie in meine dev Bibliothek bewegen, bemerkte ich, dass es ein Problem mit dieser Codezeile:
//Get the times stored in the gif
//PropertyTagFrameDelay ((PROPID) 0x5100) comes from gdiplusimaging.h
//More info on http://msdn.microsoft.com/en-us/library/windows/desktop/ms534416(v=vs.85).aspx
var times = img.GetPropertyItem(0x5100).Value;
Wenn diese auf Windows .Net dies mit (example GIF), das Array hat die gleiche Größe wie die Anzahl der Frames in der animierten GIF
und mit der Dauer der Frames gefüllt. In diesem Fall wird ein Byte [20], die umwandelt (BitConverter.ToInt32()) Dauern:
[75,0,0,0,125,0,0,0,125,0,0,0,125,0,0,0,250,0,0,0]
On MonoMac jedoch diese Codezeile für das gleiche Beispiel gibt einen GIF byte[4]
die nur umwandelt eine Dauer (die erste):
[75,0,0,0]
getestet habe ich diese für 10 verschiedene GIF's
und das Ergebnis ist immer das gleiche. Unter Windows alle Dauern im byte [] sind, während MonoMac nur die erste Dauer aufgeführt:
[x,0,0,0]
[75,0,0,0]
[50,0,0,0]
[125,0,0,0]
am Mono Suche System.Drawing.Image
source code, scheint die Länge in diesem Verfahren festgelegt werden, die ein GDI Wrapper:
status = GDIPlus.GdipGetPropertyItemSize (nativeObject, propid,out propSize);
Allerdings sehe ich wirklich keine Probleme, nicht mit der Quelle wie mit meiner Implementierung. Fehle ich etwas oder ist das ein Fehler?
Ich glaube, Sie werden die Antwort in der Mono GDI Plus-Implementierung finden. Ich habe es mir angeschaut, aber ich habe nicht die Expertise über den Gif-Codec, um zu entziffern, was vor sich geht. Folgendes ist etwas von dem, was ich gefunden habe. [Image.FromFile] (https://github.com/mono/mono/blob/master/mcs/class/System.Drawing/System.Drawing/Image.cs) ruft in [libgdiplus] auf (https: // github. com/mono/libgdiplus/Baum/Master/src). Inside libgdiplus sind Funktionen zum Laden von Bildern. Die Funktion 'gdip_load_gif_image' innerhalb der Datei [gifcodec.c] (https://github.com/mono/libgdiplus/blob/master/src/gifcodec.c) lädt Gif-Bilder. –
Sie müssen prüfen, was innerhalb von 'gdip_load_gif_image' passiert. Wie ich bereits erwähnt habe, ist das der Ort, wo das Bild geladen/decodiert wird und wo ich den Fehler vermute. Ich habe nicht die Gif-Expertise, um herauszufinden, was vor sich geht. Viel Glück. –