Recentemente, stavo cercando di rispondere ad un altro SO question sul caricamento dei frame (Bitmap e durata) di GIFs
animato. Il codice può essere trovato su pastenbin.MonoMac System.Drawing.Image.GetPropertyItem (0x5100)
Nel fare ulteriori test su questo codice prima di spostarlo nella mia libreria di dev, ho notato che c'è un problema con questa riga di codice:
//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;
Quando si esegue questo su Windows .Net utilizzando questo (example GIF), la matrice ha le stesse dimensioni della quantità di fotogrammi nell'animazione GIF
e piena della durata dei fotogrammi. In questo caso un byte [20] che si converte (BitConverter.ToInt32()) durate:
[75,0,0,0,125,0,0,0,125,0,0,0,125,0,0,0,250,0,0,0]
In MonoMac tuttavia, questa riga di codice per lo stesso esempio GIF restituisce un byte[4]
che converte solo una durata (la prima):
[75,0,0,0]
ho testato questo per 10 diversi GIF's
e il risultato è sempre lo stesso. In Windows tutte le durate sono nel byte [], mentre MonoMac elenca solo il primo Durata:
[x,0,0,0]
[75,0,0,0]
[50,0,0,0]
[125,0,0,0]
Guardando il Mono System.Drawing.Image
source code, la lunghezza sembrano essere impostato in questo metodo, che è un wrapper GDI:
status = GDIPlus.GdipGetPropertyItemSize (nativeObject, propid,out propSize);
Tuttavia, non vedo alcun problema, non con la fonte come con la mia implementazione. Mi manca qualcosa o si tratta di un bug?
Credo che troverete la risposta nell'implementazione Mono GDI Plus. Ho dato un'occhiata a questo, ma non ho la competenza sul codec gif per decifrare cosa sta succedendo. Di seguito è riportato un po 'di ciò che ho trovato. [Image.FromFile] (https://github.com/mono/mono/blob/master/mcs/class/System.Drawing/System.Drawing/Image.cs) chiama in [libgdiplus] (https: // github. com/mono/libgdiplus/albero/master/src). All'interno di libgdiplus ci sono funzioni per caricare le immagini. La funzione 'gdip_load_gif_image' all'interno del file [gifcodec.c] (https://github.com/mono/libgdiplus/blob/master/src/gifcodec.c) carica le immagini gif. –
Dovrai esaminare cosa succede all'interno di 'gdip_load_gif_image'. Come ho detto, è qui che l'immagine viene caricata/decodificata e dove indovinerei il bug. Non ho la competenza GIF per capire cosa sta succedendo. In bocca al lupo. –