您的位置:首页 > 移动开发 > IOS开发

Image I/O

2016-03-12 19:23 393 查看
Image I/O 是 iOS SDK 提供的一个图片编解码器,支持 JPEG, JPEG2000, RAW, TIFF, BMP, GIF, and PNG ,支持 metadata 读取,提供颜色管理。

CGImageSource :数据读取的接口,支持 URL, CFData, or data consumer 。提供读取 CGImage, Thumbnail CGImage, image properties 等等。

CGImageDestination:数据写入的接口,支持 URL, CFData, or data consumer 。可写入单个或多个 CGImage, 包括 Thumbnail CGImage, image properties等。

#import "ViewController.h"
#import "GifView.h"

@interface ViewController ()

@property (nonatomic, strong) GifView *gifView;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

//将资源文件打包
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"Source.bundle" ofType:nil];
NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];

NSString *filePath = [bundle pathForResource:@"info.plist" ofType:nil];
NSArray  *dataArr = [NSArray arrayWithContentsOfFile:filePath];

NSDictionary *dict = dataArr[0];

NSString *gifPath = [bundle pathForResource:dict[@"png"] ofType:nil];

UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageWithContentsOfFile:gifPath]];
imageView.userInteractionEnabled = YES;
imageView.center = CGPointMake(150, 150);
[self.view addSubview:imageView];

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGesture:)];
[imageView addGestureRecognizer:tap];

}

- (void)tapGesture:(UITapGestureRecognizer *)gesture {

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"Source.bundle" ofType:nil];
NSBundle *bundle = [NSBundle bundleWithPath:bundlePath];

NSString *filePath = [bundle pathForResource:@"info.plist" ofType:nil];
NSArray  *dataArr = [NSArray arrayWithContentsOfFile:filePath];

NSDictionary *dict = dataArr[0];

NSString *gifPath = [bundle pathForResource:dict[@"gif"] ofType:nil];
NSURL *url = [NSURL fileURLWithPath:gifPath];
GifView *gifView = [[GifView alloc] initWithCenter:CGPointMake(150, 150) fileURL:url];
self.gifView = gifView;
[self.view addSubview:gifView];

[self.gifView startGif];

}

@end


.h文件

#import <UIKit/UIKit.h>

@interface GifView : UIView

/*
* @brief desingated initializer
*/
- (id)initWithCenter:(CGPoint)center fileURL:(NSURL*)fileURL;

/*
* @brief start Gif Animation
*/
- (void)startGif;

/*
* @brief stop Gif Animation
*/
- (void)stopGif;

/*
* @brief get frames image(CGImageRef) in Gif
*/
+ (NSArray*)framesInGif:(NSURL*)fileURL;

@end


.m文件

#import "GifView.h"
#import <ImageIO/ImageIO.h>
#import <QuartzCore/CoreAnimation.h>

/*
* @brief resolving gif information
*/
void getFrameInfo(CFURLRef url, NSMutableArray *frames, NSMutableArray *delayTimes, CGFloat *totalTime,CGFloat *gifWidth, CGFloat *gifHeight)
{
// 读取图片数据
CGImageSourceRef gifSource = CGImageSourceCreateWithURL(url, NULL);

// get frame count 获取图片数量
size_t frameCount = CGImageSourceGetCount(gifSource);

for (size_t i = 0; i < frameCount; ++i) {
// get each frame 获取图片大小
CGImageRef frame = CGImageSourceCreateImageAtIndex(gifSource, i, NULL);
[frames addObject:(__bridge id)frame];
CGImageRelease(frame);

// get gif info with each frame 获取图片信息
NSDictionary *dict = (NSDictionary*)CFBridgingRelease(CGImageSourceCopyPropertiesAtIndex(gifSource, i, NULL));
NSLog(@"kCGImagePropertyGIFDictionary %@", [dict valueForKey:(NSString*)kCGImagePropertyGIFDictionary]);

// get gif size
if (gifWidth != NULL && gifHeight != NULL) {
*gifWidth = [[dict valueForKey:(NSString*)kCGImagePropertyPixelWidth] floatValue];
*gifHeight = [[dict valueForKey:(NSString*)kCGImagePropertyPixelHeight] floatValue];
}

// kCGImagePropertyGIFDictionary中kCGImagePropertyGIFDelayTime,kCGImagePropertyGIFUnclampedDelayTime值是一样的
NSDictionary *gifDict = [dict valueForKey:(NSString*)kCGImagePropertyGIFDictionary];
[delayTimes addObject:[gifDict valueForKey:(NSString*)kCGImagePropertyGIFDelayTime]];

if (totalTime) {
*totalTime = *totalTime + [[gifDict valueForKey:(NSString*)kCGImagePropertyGIFDelayTime] floatValue];
}
}
}

@interface GifView () {

NSMutableArray *_frames;
NSMutableArray *_frameDelayTimes;

CGFloat _totalTime;         // seconds
CGFloat _width;
CGFloat _height;
}

@end

@implementation GifView

- (id)initWithCenter:(CGPoint)center fileURL:(NSURL*)fileURL;
{
self = [super initWithFrame:CGRectZero];
if (self) {

self.backgroundColor = [UIColor clearColor];

_frames = [[NSMutableArray alloc] init];
_frameDelayTimes = [[NSMutableArray alloc] init];

_width = 0;
_height = 0;

if (fileURL) {
getFrameInfo((__bridge CFURLRef)fileURL, _frames, _frameDelayTimes, &_totalTime, &_width, &_height);
}

self.frame = CGRectMake(0, 0, _width, _height);
self.center = center;
}

return self;
}

+ (NSArray*)framesInGif:(NSURL *)fileURL
{
NSMutableArray *frames = [NSMutableArray arrayWithCapacity:3];
NSMutableArray *delays = [NSMutableArray arrayWithCapacity:3];

getFrameInfo((__bridge CFURLRef)fileURL, frames, delays, NULL, NULL, NULL);

return frames;
}

- (void)startGif
{
CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"contents"];

NSMutableArray *times = [NSMutableArray arrayWithCapacity:3];
CGFloat currentTime = 0;
int count = (int)_frameDelayTimes.count;
for (int i = 0; i < count; ++i) {
[times addObject:[NSNumber numberWithFloat:(currentTime / _totalTime)]];
currentTime += [[_frameDelayTimes objectAtIndex:i] floatValue];
}
[animation setKeyTimes:times];

NSMutableArray *images = [NSMutableArray arrayWithCapacity:3];
for (int i = 0; i < count; ++i) {
[images addObject:[_frames objectAtIndex:i]];
}

[animation setValues:images];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear]];
animation.duration = _totalTime;
animation.delegate = self;
animation.repeatCount = 1;

[self.layer addAnimation:animation forKey:@"gifAnimation"];

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(_totalTime * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self stopGif];
});
}

- (void)stopGif
{
[self.layer removeAllAnimations];

[self removeFromSuperview];
}

// remove contents when animation end
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag
{
self.layer.contents = nil;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios