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

简介: 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);

目录
相关文章
|
21天前
|
搜索推荐 Android开发 iOS开发
安卓与iOS系统的用户界面设计对比分析
本文通过对安卓和iOS两大操作系统的用户界面设计进行对比分析,探讨它们在设计理念、交互方式、视觉风格等方面的差异及各自特点,旨在帮助读者更好地理解和评估不同系统的用户体验。
18 1
|
2月前
|
Android开发 数据安全/隐私保护 iOS开发
安卓与iOS系统的发展趋势与比较分析
【2月更文挑战第6天】 在移动互联网时代,安卓和iOS系统作为两大主流移动操作系统,各自呈现出不同的发展趋势。本文将从技术角度出发,对安卓和iOS系统的发展方向、特点及未来趋势进行比较分析,以期为读者提供更深入的了解和思考。
33 4
|
2月前
|
iOS开发 开发者
苹果iOS App Store上架操作流程详解:从开发者账号到应用发布
很多开发者在开发完iOS APP、进行内测后,下一步就面临上架App Store,不过也有很多同学对APP上架App Store的流程不太了解,下面我们来说一下iOS APP上架App Store的具体流程,如有未涉及到的部分,大家可以及时咨询,共同探讨。
|
2月前
|
开发者 iOS开发
iOS应用上架详细图文教程(上)
App Store作为苹果官方的应用商店,审核严格周期长一直让用户头疼不已,很多app都“死”在了审核这一关,那我们就要放弃iOS用户了吗?当然不是!本期我们从iOS app上架流程开始梳理,详细了解下iOS app上架的那些事。
|
23天前
|
安全 数据安全/隐私保护 虚拟化
iOS应用加固方案解析:ipa加固安全技术全面评测
iOS应用加固方案解析:ipa加固安全技术全面评测
35 3
|
29天前
|
运维 监控 安全
应用研发平台EMAS常见问题之sophix ios flutter热更新如何解决
应用研发平台EMAS(Enterprise Mobile Application Service)是阿里云提供的一个全栈移动应用开发平台,集成了应用开发、测试、部署、监控和运营服务;本合集旨在总结EMAS产品在应用开发和运维过程中的常见问题及解决方案,助力开发者和企业高效解决技术难题,加速移动应用的上线和稳定运行。
26 0
|
1月前
|
Web App开发 前端开发 网络安全
前端分析工具之 Charles 录制 Android/IOS 手机的 https 应用
【2月更文挑战第21天】前端分析工具之 Charles 录制 Android/IOS 手机的 https 应用
46 1
前端分析工具之 Charles 录制 Android/IOS 手机的 https 应用
|
2月前
|
安全 搜索推荐 Android开发
Android 与 iOS 的比较分析
【2月更文挑战第5天】 Android 和 iOS 是目前市场上两种最流行的移动操作系统,它们都拥有自己的特点和优势。本文将会分别从操作系统设计、应用生态、安全性等方面对这两种操作系统进行比较和分析,希望能够帮助读者更好地选择适合自己的移动设备。
|
2月前
|
Linux Android开发 iOS开发
iOS 应用上架的步骤和工具简介
APP开发助手是一款能够辅助iOS APP上架到App Store的工具,它解决了iOS APP上架流程繁琐且耗时的问题,帮助跨平台APP开发者顺利将应用上架到苹果应用商店。最重要的是,即使没有配置Mac苹果机,也可以使用该工具完成一系列操作,包括iOS证书申请、创建iOS开发者证书和 iOS发布证书等各类证书。此外,在Windows、Linux或Mac系统中上传IPA到App Store也变得简单快捷,从而大大简化了iOS APP上架的流程。
|
2月前
|
移动开发 前端开发 安全
保护你的 iOS 应用,防止逆向破解
保护你的 iOS 应用,防止逆向破解