Récemment, j'essayais de répondre à un autre SO question sur le chargement des cadres (Bitmap et durée) de GIFs
animé. Le code peut être trouvé sur pastenbin.MonoMac System.Drawing.Image.GetPropertyItem (0x5100)
Tout en faisant des tests supplémentaires sur ce code avant de le déplacer dans ma bibliothèque dev, je remarque qu'il ya un problème avec cette ligne de code:
//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;
Lors de l'exécution de cette sous Windows .Net utilisant ce (example GIF), le tableau est de la même taille que la quantité d'images dans le GIF
animé et rempli avec les durées des cadres. Dans ce cas, un octet [20] qui se transforme en (BitConverter.ToInt32()) durées:
[75,0,0,0,125,0,0,0,125,0,0,0,125,0,0,0,250,0,0,0]
Sur Monomac cependant, cette ligne de code pour le même exemple GIF retourne un byte[4]
qui convertit seulement une durée de (la première):
[75,0,0,0]
J'ai testé cela pour 10 différents GIF's
et le résultat est toujours le même. Sous Windows toutes les durées sont dans l'octet [], alors que Monomac ne répertorie que la première durée:
[x,0,0,0]
[75,0,0,0]
[50,0,0,0]
[125,0,0,0]
En regardant le Mono System.Drawing.Image
source code, la longueur semble être définie dans cette méthode, qui est une enveloppe GDI:
status = GDIPlus.GdipGetPropertyItemSize (nativeObject, propid,out propSize);
Cependant, je ne vois vraiment aucun problème, pas avec la source comme avec mon implémentation. Ai-je raté quelque chose ou est-ce un bug?
Je crois que vous trouverez la réponse dans l'implémentation de Mono GDI Plus. Je l'ai regardé, mais je n'ai pas l'expertise sur le codec gif pour déchiffrer ce qui se passe. Voici une partie de ce que j'ai trouvé. [Image.FromFile] (https://github.com/mono/mono/blob/master/mcs/class/System.Drawing/System.Drawing/Image.cs) appelle [libgdiplus] (https: // github. com/mono/libgdiplus/arbre/maître/src). Inside libgdiplus sont des fonctions pour charger des images. La fonction 'gdip_load_gif_image' à l'intérieur du fichier [gifcodec.c] (https://github.com/mono/libgdiplus/blob/master/src/gifcodec.c) charge les images gif. –
Vous aurez besoin de regarder ce qui se passe à l'intérieur de 'gdip_load_gif_image'. Comme je l'ai mentionné, c'est là que l'image est chargée/décodée et où je suppose que le bogue est. Je n'ai pas l'expertise du gif pour comprendre ce qui se passe. Bonne chance. –