我已经想出了如何使用以下方法返回数据,例如该 gif 中的帧数:
NSNumber *frames = [bitmapRep valueForProperty:@"NSImageFrameCount"];
但是,对于如何实际访问该框架作为它自己的对象,我有点困惑。
要访问特殊框架indexOfFrame
( 0 <= indexOfFrame < [frames intValue]
),您只需设置NSImageCurrentFrame
即可。无需使用 CG 功能或复制帧。您可以留在面向对象的 Cocoa 世界中。一个小例子显示了所有 GIF 帧的持续时间:
NSNumber *frames = [bitmapRep valueForProperty:@"NSImageFrameCount"];
if( frames!=nil ){ // bitmapRep is a Gif imageRep
for( NSUInteger i=0; i<[frames intValue]; i++ ){
[bitmapRep setProperty:NSImageCurrentFrame
withValue:[NSNumber numberWithUnsignedInt:i] ];
NSLog(@"%2d duration=%@",
i, [bitmapRep valueForProperty:NSImageCurrentFrameDuration] );
}
}
另一个例子:将 GIF 图像的所有帧作为 PNG 文件写入文件系统:
NSNumber *frames = [bitmapRep valueForProperty:@"NSImageFrameCount"];
if( frames!=nil ){ // bitmapRep is a Gif imageRep
for( NSUInteger i=0; i<[frames intValue]; i++ ){
[bitmapRep setProperty:NSImageCurrentFrame
withValue:[NSNumber numberWithUnsignedInt:i] ];
NSData *repData = [bitmapRep representationUsingType:NSPNGFileType
properties:nil];
[repData writeToFile:
[NSString stringWithFormat:@"/tmp/gif_%02d.png", i ] atomically:YES];
}
}