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);

目录
相关文章
|
2月前
|
搜索推荐 数据管理 定位技术
iOS应用开发中有多种主流框架
iOS应用开发中有多种主流框架
233 60
|
2月前
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
236 4
|
2月前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
28天前
|
iOS开发 开发者 MacOS
深入探索iOS开发中的SwiftUI框架
【10月更文挑战第21天】 本文将带领读者深入了解Apple最新推出的SwiftUI框架,这一革命性的用户界面构建工具为iOS开发者提供了一种声明式、高效且直观的方式来创建复杂的用户界面。通过分析SwiftUI的核心概念、主要特性以及在实际项目中的应用示例,我们将展示如何利用SwiftUI简化UI代码,提高开发效率,并保持应用程序的高性能和响应性。无论你是iOS开发的新手还是有经验的开发者,本文都将为你提供宝贵的见解和实用的指导。
121 66
|
1月前
|
Java 开发工具 Android开发
安卓与iOS开发环境对比分析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据半壁江山。本文深入探讨了这两个平台的开发环境,从编程语言、开发工具到用户界面设计等多个角度进行比较。通过实际案例分析和代码示例,我们旨在为开发者提供一个清晰的指南,帮助他们根据项目需求和个人偏好做出明智的选择。无论你是初涉移动开发领域的新手,还是寻求跨平台解决方案的资深开发者,这篇文章都将为你提供宝贵的信息和启示。
33 8
|
2月前
|
安全 Android开发 数据安全/隐私保护
深入探索Android与iOS系统安全性的对比分析
在当今数字化时代,移动操作系统的安全已成为用户和开发者共同关注的重点。本文旨在通过比较Android与iOS两大主流操作系统在安全性方面的差异,揭示两者在设计理念、权限管理、应用审核机制等方面的不同之处。我们将探讨这些差异如何影响用户的安全体验以及可能带来的风险。
56 1
|
2月前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
41 2
|
2月前
|
iOS开发 开发者
探索iOS开发中的SwiftUI框架
【10月更文挑战第39天】在苹果的生态系统中,SwiftUI框架以其声明式语法和易用性成为开发者的新宠。本文将深入SwiftUI的核心概念,通过实际案例展示如何利用这一框架快速构建用户界面,并探讨其对iOS应用开发流程的影响。
|
2月前
|
JSON 前端开发 API
探索iOS开发之旅:打造你的第一个天气应用
【10月更文挑战第36天】在这篇文章中,我们将踏上一段激动人心的旅程,一起构建属于我们自己的iOS天气应用。通过这个实战项目,你将学习到如何从零开始搭建一个iOS应用,掌握基本的用户界面设计、网络请求处理以及数据解析等核心技能。无论你是编程新手还是希望扩展你的iOS开发技能,这个项目都将为你提供宝贵的实践经验。准备好了吗?让我们开始吧!
|
2月前
|
Swift iOS开发 UED
如何使用Swift和UIKit在iOS应用中实现自定义按钮动画
本文通过一个具体案例,介绍如何使用Swift和UIKit在iOS应用中实现自定义按钮动画。当用户点击按钮时,按钮将从圆形变为椭圆形,颜色从蓝色渐变到绿色;释放按钮时,动画以相反方式恢复。通过UIView的动画方法和弹簧动画效果,实现平滑自然的过渡。
76 1