c# – MonoMac System.Drawing.Image.GetPropertyItem(0x5100)

最近,我试图回答关于加载动画GIF的帧(位图和持续时间)的另一个 SO question.该代码可在 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;

使用此(example GIF)在Windows .Net上运行时,阵列与动画GIF中的帧数相同,并填充帧的持续时间.在这种情况下,一个字节[20]转换为(BitConverter.ToInt32())5个持续时间:

[75,125,250,0]

但是,在MonoMac上,同一个示例GIF的这行代码返回一个字节[4],它只转换为一个持续时间(第一个):

[75,0]

我测试了10个不同的GIF,结果总是一样的.在Windows上,所有持续时间都在byte []中,而MonoMac仅列出第一个持续时间:

[x,0]
[75,0]
[50,0]
[125,0]

看一下Mono System.Drawing.Image source code,这个方法似乎设置了长度,这是一个GDI包装器:

status = GDIPlus.GdipGetPropertyItemSize (nativeObject,propid,out propSize);

但是,我真的没有看到任何问题,而不是我的实现中的源代码.我错过了什么或这是一个错误吗?

解决方法

如果您使用 look into libgdiplus,您将看到始终从活动位图读取属性
if (gdip_bitmapdata_property_find_id(image->active_bitmap,propID,&index) != Ok) {

您可以通过调用Image.SelectActiveFrame来设置活动位图,然后mono将逐个返回正确的持续时间.由于这与windows不兼容,我称之为单声道bug.作为一个简单的解决方法,您当然可以检查数组长度并处理这两种情况.这将比检查单声道更好,因为如果单声道固定,这将继续工作.

相关文章

在项目中使用SharpZipLib压缩文件夹的时候,遇到如果目录较深,则压缩包中的文件夹同样比较深的问题。比...
项目需要,几十万张照片需要计算出每个照片的特征值(调用C++编写的DLL)。 业务流程:选择照片...
var array = new byte[4]; var i = Encoding.UTF8.GetBytes(100.ToString("x2"));//...
其实很简单,因为Combox的Item是一个K/V的object,那么就可以把它的items转换成IEnumerable<Dic...
把.net4.6安装包打包进安装程序。 关键脚本如下: 头部引用字符串对比库 !include "WordFunc....
项目需求(Winform)可以批量打印某个模板,经过百度和摸索,使用iTextSharp+ZXing.NetʿreeSp...