aml*_*szk 5 image-processing objective-c uiimage ios
当转换一个GIF成动画的UIImage用于每个帧的延迟是从属性提取kCGImagePropertyGIFDelayTime或kCGImagePropertyGIFUnclampedDelayTime
像这样:
NSString *frameKeyPath = [NSString stringWithFormat:@"%@.%@",(NSString*)kCGImagePropertyGIFDictionary,kCGImagePropertyGIFUnclampedDelayTime];
CFDictionaryRef cfFrameProperties = CGImageSourceCopyPropertiesAtIndex(source,i,nil);
NSDictionary *frameProperties = (__bridge NSDictionary*)cfFrameProperties;
NSNumber *delayTimeProp = [frameProperties valueForKeyPath:frameKeyPath];
Run Code Online (Sandbox Code Playgroud)
在两个示例情况下,Chrome都会选择正确的:
kCGImagePropertyGIFDelayTime= 0.1:http://i.imgur.com/tX9cjUO.gif
kCGImagePropertyGIFUnclampedDelayTime= 0.01:http://i.minus.com/iIOyK7SKp8TYc.gif
为每个案例选择一个会导致其中一个示例图像动画太慢或太快
有没有办法确定使用哪个属性?
谢谢
使用webkit方法结束选择,松开,钳位或0.1默认
+ (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's 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;
}
Run Code Online (Sandbox Code Playgroud)