2014-11-23 140 views
0

我有兩個動畫GIF:
http://d-32.com/uploads/gif1.gifhttp://d-32.com/uploads/gif2.gifNSBitmapImageRep從持續時間動畫GIF

當使用NSBitmapImageRep我得到的0.15s用於第二第一GIF和0.1s的幀持續時間。
但0.1是減慢第二個gif的方法。

當使用imagemagick我也得到0.15s爲第一,但0.03s爲第二個gif,這是正確的。

我做錯了什麼,或者是NSBitmapImageRep,即使用NSImageView來顯示gif無用,我將不得不訴諸一個webview(它可以正確顯示兩個gif)?

+0

你這樣做沒有錯。 NSBitmapImageRep使用DelayTime(第二個gif中的0.1秒)而不是UnclampedDelayTime(0.03秒)。這兩個值都顯示在預覽應用程序和相應的CGImage中(每個NSBitmapImageRep都是一個CGImage)。但NSBitmapImageRep使用了鉗位值,因爲它認爲0.03秒太快(而你認爲0.1秒太慢)。應該可以使用setProperty爲NSBitmapImageRep中的每個幀更改這些值:NSImageCurrentFrameDuration withValue:@ 0.03但是我的第一個實驗失敗了,仍在繼續。 – 2014-11-24 16:29:07

+0

這只是一個示例gifs,我將不得不處理未知的gif,因此硬編碼0.03將不起作用。所以基本上我必須自己讀取gif文件中的信息? – 2014-11-24 16:31:06

回答

0

因此,感謝海因裏希,我現在知道gif是兩個值,即真實值和固定值。令人遺憾的是,NSBitmapImageRep只提供了固定值,但使用CGImageProperty我可以讀取這兩個值。因此,我通過每幀迭代,用正確的更新時間,並最終創建一個CAAnimation像:https://github.com/orta/GIFs/blob/master/objc/GIFs/ORImageView.m

因此,這是用於更新時間代碼:

NSDictionary *properties = (__bridge_transfer NSDictionary *)CGImageSourceCopyPropertiesAtIndex(imageSource, i, nil); 
float duration = [[[properties objectForKey:(__bridge NSString *)kCGImagePropertyGIFDictionary] 
        objectForKey:(__bridge NSString *) kCGImagePropertyGIFUnclampedDelayTime] doubleValue]; 
[bitmapRepresentation setProperty:NSImageCurrentFrame withValue:[NSNumber numberWithInt:i]]; 
[bitmapRepresentation setProperty:NSImageCurrentFrameDuration withValue:[NSNumber numberWithFloat:duration]];