Ostatnio próbowałem odpowiedzieć na kolejne SO question dotyczące ładowania klatek (bitmapa i czas trwania) animowanego GIFs
. Kod można znaleźć pod adresem pastenbin.MonoMac System.Drawing.Image.GetPropertyItem (0x5100)
Podczas wykonywania dodatkowych badań na temat tego kodu przed przeniesieniem go do mojej biblioteki dev, zauważyłem, że jest problem z tej linii kodu:
//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;
Uruchamiając ten Windows .NET przy użyciu tego (example GIF), tablica ma taki sam rozmiar, jak liczba klatek w animowanym pliku GIF
i jest wypełniona czasami trwania klatek. W tym przypadku bajt [20], w którym przekształca się (BitConverter.ToInt32()) trwania:
[75,0,0,0,125,0,0,0,125,0,0,0,125,0,0,0,250,0,0,0]
Na Monoman Jednakże ta linia kodu w tym samym przykładzie GIF zwraca byte[4]
który przekształca się tylko jeden okres (pierwszy)
[75,0,0,0]
i badane w tym 10 różnych GIF's
a wynik jest zawsze taki sam. W systemie Windows wszystkie okresy są w byte [], natomiast Monoman wymienia tylko pierwszy czas trwania:
[x,0,0,0]
[75,0,0,0]
[50,0,0,0]
[125,0,0,0]
Patrząc na Mono System.Drawing.Image
source code długość wydają się być ustawione w tej metodzie, która jest GDI wrapper:
status = GDIPlus.GdipGetPropertyItemSize (nativeObject, propid,out propSize);
Jednak naprawdę nie widzę żadnych problemów, nie ze źródłem, jak z moją implementacją. Czy brakuje mi czegoś lub jest to błąd?
Wierzę, że znajdziesz odpowiedź w implementacji Mono GDI Plus. Rzuciłem okiem na to, ale nie mam wiedzy na temat kodeku gif, żeby rozszyfrować to, co się dzieje. Oto niektóre z tego, co znalazłem. [Image.FromFile] (https://github.com/mono/mono/blob/master/mcs/class/System.Drawing/System.Drawing/Image.cs) wywołuje funkcję [libgdiplus] (https: // github. com/mono/libgdiplus/drzewo/master/src). Wewnątrz libgdiplus są funkcje do ładowania obrazów. Funkcja 'gdip_load_gif_image' wewnątrz pliku [gifcodec.c] (https://github.com/mono/libgdiplus/blob/master/src/gifcodec.c) ładuje obrazy gif. –
Będziesz musiał sprawdzić, co dzieje się wewnątrz 'gdip_load_gif_image'. Jak już wspomniałem, jest to miejsce, w którym obraz jest ładowany/dekodowany i gdzie zgaduję, że jest to błąd. Nie mam wiedzy na temat gif, aby dowiedzieć się, co się dzieje. Powodzenia. –