Gần đây, tôi đã cố gắng trả lời một số khác SO question về cách tải các khung (Bitmap và thời lượng) của hoạt ảnh GIFs
. Mã này có thể được tìm thấy trên pastenbin.MonoMac System.Drawing.Image.GetPropertyItem (0x5100)
Trong khi làm bài kiểm tra bổ sung đối với mã này trước khi chuyển nó vào thư viện dev của tôi, tôi nhận thấy rằng có một vấn đề với dòng mã này:
//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;
Khi chạy này trên Windows Net sử dụng này (example GIF), mảng có cùng kích thước với số lượng khung hình trong hoạt ảnh GIF
và được lấp đầy với thời lượng của khung. Trong trường hợp này một byte [20] mà chuyển đến (BitConverter.ToInt32()) khoảng thời gian:
[75,0,0,0,125,0,0,0,125,0,0,0,125,0,0,0,250,0,0,0]
On MonoMac Tuy nhiên, dòng mã này cho ví dụ tương tự GIF trả về một byte[4]
mà chuyển đến chỉ một thời gian (lần đầu tiên):
[75,0,0,0]
Tôi đã thử nghiệm điều này cho 10 khác nhau GIF's
và kết quả luôn như cũ. Trên Windows tất cả các khoảng thời gian đang trong byte [], trong khi MonoMac chỉ liệt kê thời gian đầu tiên:
[x,0,0,0]
[75,0,0,0]
[50,0,0,0]
[125,0,0,0]
Nhìn vào Mono System.Drawing.Image
source code, chiều dài dường như được thiết lập trong phương pháp này, mà là một wrapper GDI:
status = GDIPlus.GdipGetPropertyItemSize (nativeObject, propid,out propSize);
Tuy nhiên, tôi không thực sự thấy bất kỳ vấn đề nào, không phải với nguồn như khi triển khai. Tôi đang thiếu một cái gì đó hoặc là một lỗi này?
Tôi tin rằng bạn sẽ tìm thấy câu trả lời trong triển khai Mono GDI Plus. Tôi đã xem xét nó, nhưng tôi không có chuyên môn về codec gif để giải mã những gì đang xảy ra. Sau đây là một số những gì tôi tìm thấy. [Image.FromFile] (https://github.com/mono/mono/blob/master/mcs/class/System.Drawing/System.Drawing/Image.cs) gọi vào [libgdiplus] (https: // github. com/mono/libgdiplus/tree/master/src). Bên trong libgdiplus có chức năng tải hình ảnh. Hàm 'gdip_load_gif_image' bên trong tệp [gifcodec.c] (https://github.com/mono/libgdiplus/blob/master/src/gifcodec.c) tải hình ảnh gif. –
Bạn sẽ cần phải nhìn vào những gì xảy ra bên trong 'gdip_load_gif_image'. Như tôi đã đề cập, đó là nơi hình ảnh được tải/giải mã và nơi tôi đoán được lỗi. Tôi không có chuyên môn gif để tìm ra những gì đang xảy ra. Chúc may mắn. –