天天看点

iOS中ImageIO框架详解与应用分析(一)

一、引言

   ImageIO框架提供了读取与写入图片数据的基本方法,使用它可以直接获取到图片文件的内容数据,ImageIO框架中包含6个头文件,其中完成主要功能的是前两个头文件中定义的方法:

1.CGImageSource.h:负责读取图片数据。

2.CGImageDestination.h:负责写入图片数据。

3.CGImageMetadata.h:图片文件元数据类。

4.CGImageProperties:定义了框架中使用的字符串常量和宏。

5.ImageIOBase.h:预处理逻辑,无需关心。

二、CGImageSource详解

   CGImageSource类的主要作用是用来读取图片数据,在平时开发中,关于图片我们使用的最多的可能是UIImage类,UIImage是iOS系统UI系统中用于构建图像对象的类,但是其中只有图像数据,实际上一个图片文件中存储的除了图片数据外,还有一些地理位置、设备类型、时间等信息,除此之外,一个图片文件中可能存储的也不只一张图像(例如gif文件)。CGImageSource就是这样的一个抽象图片数据示例,从其中可以获取到我们所关心的所有数据。

   读取图片文件数据,并将其展示在视图的简单代码示例如下:

//获取图片文件路径

NSString * path = [[NSBundle mainBundle]pathForResource:@"timg" ofType:@"jpeg"];

NSURL * url = [NSURL fileURLWithPath:path];

CGImageRef myImage = NULL;

CGImageSourceRef myImageSource;

//通过文件路径创建CGImageSource对象

myImageSource = CGImageSourceCreateWithURL((CFURLRef)url, NULL);

//获取第一张图片

myImage = CGImageSourceCreateImageAtIndex(myImageSource,

                                         0,

                                         NULL);

CFRelease(myImageSource);

UIImageView * image = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 200, 200)];

image.image = [UIImage imageWithCGImage:myImage];

[self.view addSubview:image];

上面的示例代码采用的是本地的一个素材文件,当然通过网络图片链接也是可以创建CGImageSource独享的。除了通过URL链接的方式创建对象,ImageIO框架中还提供了两种方法,解析如下:

//通过数据提供器创建CGImageSource对象

/*

CGDataProviderRef是CoreGraphics框架中的一个数据读取类,其也可以通过Data数据,URL和文件名来创建

*/

CGImageSourceRef __nullable CGImageSourceCreateWithDataProvider(CGDataProviderRef __nonnull provider, CFDictionaryRef __nullable options);

//通过Data数据创建CGImageSource对象

CGImageSourceRef __nullable CGImageSourceCreateWithData(CFDataRef __nonnull data, CFDictionaryRef __nullable options);

需要注意,上面所提到的所有创建CGImageSource的方法中都可以传入一个CFDictionaryRef类型的字典,可以配置的键值意义如下:

设置一个预期的图片文件格式,需要设置为字符串类型的值

const CFStringRef kCGImageSourceTypeIdentifierHint;

设置是否以解码的方式读取图片数据 默认为kCFBooleanTrue

如果设置为true,在读取数据时就进行解码 如果为false 则在渲染时才进行解码

const CFStringRef kCGImageSourceShouldCache;

返回CGImage对象时是否允许使用浮点值 默认为kCFBooleanFalse

const CFStringRef kCGImageSourceShouldAllowFloa;

设置如果不存在缩略图则创建一个缩略图,缩略图的尺寸受开发者设置影响,如果不设置尺寸极限,则为图片本身大小

默认为kCFBooleanFalse

const CFStringRef kCGImageSourceCreateThumbnailFromImageIfAbsent;

设置是否创建缩略图,无论原图像有没有包含缩略图kCFBooleanFalse

const CFStringRef kCGImageSourceCreateThumbnailFromImageAlways;

设置缩略图的宽高尺寸 需要设置为CFNumber值

const CFStringRef kCGImageSourceThumbnailMaxPixelSize;

设置缩略图是否进行Transfrom变换

const CFStringRef kCGImageSourceCreateThumbnailWithTransform;

CGImageSource类中其他方法解析如下:

//获取CGImageSource类在CoreFundation框架中的id

CFTypeID CGImageSourceGetTypeID (void);

//获取所支持的图片格式数组

CFArrayRef __nonnull CGImageSourceCopyTypeIdentifiers(void);

//获取CGImageSource对象的图片格式

CFStringRef __nullable CGImageSourceGetType(CGImageSourceRef __nonnull isrc);

//获取CGImageSource中的图片张数 不包括缩略图

size_t CGImageSourceGetCount(CGImageSourceRef __nonnull isrc);

//获取CGImageSource的文件信息

字典参数可配置的键值对与创建CGImageSource所传参数意义一致

返回的字典中的键值意义后面介绍

CFDictionaryRef __nullable CGImageSourceCopyProperties(CGImageSourceRef __nonnull isrc, CFDictionaryRef __nullable options);

//获取CGImageSource中某个图像的附加数据

index参数设置获取第几张图像 options参数可配置的键值对与创建CGImageSource所传参数意义一致

CFDictionaryRef __nullable CGImageSourceCopyPropertiesAtIndex(CGImageSourceRef __nonnull isrc, size_t index, CFDictionaryRef __nullable options);

//获取图片的元数据信息 CGImageMetadataRef类是图像原数据的抽象

CGImageMetadataRef __nullable CGImageSourceCopyMetadataAtIndex (CGImageSourceRef __nonnull isrc, size_t index, CFDictionaryRef __nullable options);

//获取CGImageSource中的图片数据

CGImageRef __nullable CGImageSourceCreateImageAtIndex(CGImageSourceRef __nonnull isrc, size_t index, CFDictionaryRef __nullable options);

//删除一个指定索引图像的缓存

void CGImageSourceRemoveCacheAtIndex(CGImageSourceRef __nonnull isrc, size_t index);

//获取某一帧图片的缩略图

CGImageRef __nullable CGImageSourceCreateThumbnailAtIndex(CGImageSourceRef __nonnull isrc, size_t index, CFDictionaryRef __nullable options);

//创建一个空的CGImageSource容器,逐步加载大图片

CGImageSourceRef __nonnull CGImageSourceCreateIncremental(CFDictionaryRef __nullable options);

//使用新的数据更新CGImageSource容器

void CGImageSourceUpdateData(CGImageSourceRef __nonnull isrc, CFDataRef __nonnull data, bool final);

//更新数据提供器来填充CGImageSource容器

void CGImageSourceUpdateDataProvider(CGImageSourceRef __nonnull isrc, CGDataProviderRef __nonnull provider, bool final);

//获取当前CGImageSource的状态

CGImageSourceStatus枚举意义:

typedef CF_ENUM(int32_t, CGImageSourceStatus) {

   kCGImageStatusUnexpectedEOF = -5, //文件结尾出错

   kCGImageStatusInvalidData = -4,   //数据无效

   kCGImageStatusUnknownType = -3,   //未知的图片类型

   kCGImageStatusReadingHeader = -2, //读标题过程中

   kCGImageStatusIncomplete = -1,    //操作不完整

   kCGImageStatusComplete = 0        //操作完整

};

CGImageSourceStatus CGImageSourceGetStatus(CGImageSourceRef __nonnull isrc);

//同上,获取某一个图片的状态

CGImageSourceStatus CGImageSourceGetStatusAtIndex(CGImageSourceRef __nonnull isrc, size_t index);