DelayTime or UnclampedDelayTime for GIFS

When converting Gif to an animated UIImage, the delay for each frame is extracted from the kCGImagePropertyGIFDelayTime or kCGImagePropertyGIFUnclampedDelayTime

Same:

 NSString *frameKeyPath = [NSString stringWithFormat:@"%@.%@",(NSString*)kCGImagePropertyGIFDictionary,kCGImagePropertyGIFUnclampedDelayTime]; CFDictionaryRef cfFrameProperties = CGImageSourceCopyPropertiesAtIndex(source,i,nil); NSDictionary *frameProperties = (__bridge NSDictionary*)cfFrameProperties; NSNumber *delayTimeProp = [frameProperties valueForKeyPath:frameKeyPath]; 

Chrome selects the correct one in both examples:

kCGImagePropertyGIFDelayTime = 0.1: http://i.imgur.com/tX9cjUO.gif

kCGImagePropertyGIFUnclampedDelayTime = 0.01: http://i.minus.com/iIOyK7SKp8TYc.gif

Choosing one for each case leads to one of the examples of image animation being too slow or too fast.

Is there a way to determine which property to use?

thanks

+4
source share
1 answer

Finished using a webkit approach that selects, frees, commits, or 0.1 by default

 + (float)frameDurationAtIndex:(NSUInteger)index source:(CGImageSourceRef)source { float frameDuration = 0.1f; CFDictionaryRef cfFrameProperties = CGImageSourceCopyPropertiesAtIndex(source,index,nil); NSDictionary *frameProperties = (__bridge NSDictionary*)cfFrameProperties; NSDictionary *gifProperties = frameProperties[(NSString*)kCGImagePropertyGIFDictionary]; NSNumber *delayTimeUnclampedProp = gifProperties[(NSString*)kCGImagePropertyGIFUnclampedDelayTime]; if(delayTimeUnclampedProp) { frameDuration = [delayTimeUnclampedProp floatValue]; } else { NSNumber *delayTimeProp = gifProperties[(NSString*)kCGImagePropertyGIFDelayTime]; if(delayTimeProp) { frameDuration = [delayTimeProp floatValue]; } } // Many annoying ads specify a 0 duration to make an image flash as quickly as possible. // We follow Firefox behavior and use a duration of 100 ms for any frames that specify // a duration of <= 10 ms. See <rdar://problem/7689300> and <http://webkit.org/b/36082> // for more information. if (frameDuration < 0.011f) frameDuration = 0.100f; CFRelease(cfFrameProperties); return frameDuration; } 
+6
source

Source: https://habr.com/ru/post/1484842/


All Articles