最近,我试图回答另一个关于加载动画帧(位图和持续时间)的问题GIFs
。代码可以在Pastenbin上找到。
在将此代码移入我的开发库之前对此代码进行额外测试时,我注意到这行代码存在问题:
//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;
当在 Windows .Net 上使用它(例如 GIF)运行它时,数组的大小与动画中的帧数量相同,GIF
并且填充了帧的持续时间。在这种情况下,一个字节 [20] 转换为 (BitConverter.ToInt32()) 5 个持续时间:
[75,0,0,0,125,0,0,0,125,0,0,0,125,0,0,0,250,0,0,0]
然而,在 MonoMac 上,同一示例 GIF 的这行代码返回 a byte[4]
,它仅转换为一个持续时间(第一个持续时间):
[75,0,0,0]
我对此进行了 10 种不同GIF's
的测试,结果始终相同。在 Windows 上,所有持续时间都在 byte[] 中,而 MonoMac 只列出第一个持续时间:
[x,0,0,0]
[75,0,0,0]
[50,0,0,0]
[125,0,0,0]
查看 MonoSystem.Drawing.Image
源代码,长度似乎是在这个方法中设置的,它是一个GDI包装器:
status = GDIPlus.GdipGetPropertyItemSize (nativeObject, propid,out propSize);
但是,我真的没有看到任何问题,而不是源代码和我的实现。我错过了什么还是这是一个错误?