Image I/O

最近想了解下 iOS 实现 GIF 是如何实现的,看到有一个轮子的实现是通过 Image I/O framework 来实现的,接读了下文档。
Image I/O Programming Guide


Image I/O framework 提供了两个类型来对图片进行操作: (CGImageSourceRef) 负责对图片的读操作 (CGImageDestinationRef) 负责对图片的写操作。

支持格式

framework 支持大多数流行的图片格式,如果想知道所有支持的格式可以通过下列的方式获得所有支持的格式的列表:

CFArrayRef mySourceTypes = CGImageSourceCopyTypeIdentifiers();`

CFShow(mySourceTypes);  // print all the supported types

CFArrayRef myDestinationTypes = CGImageDestinationCopyTypeIdentifiers();`

CFShow(myDestinationTypes);  // print all the supported types

Image Source

创建一个 CGImageSource 对象, 然后通过指定 index 和 options 去获取图片.前者是因为它是支持多图的; 后者可以通过设置属性(键值对)来完成类似创建缩略图和使用缓存的功能.通过 CGImageSourceGetCount可以获取当前 image source 所有的图片数量.

有些 image source 是包含缩略图的; 如果没有缩略图, 可以指定缩略图的最大尺寸和变化来生成它.

持续加载图片

如果图片太大或者图片需要下载, 可以使用 incremental image source, 这样就可以边加载边显示图片.大致需要按下面几步来实现

  1. 创建一个对应图片数据的 CFData 对象
  2. 通过 CGImageSourceCreateIncremental创建一个 incremental image source 对象
  3. 把图片数据赋值给 CFData 对象
  4. 调用 CGImageSourceUpdateData 指定是需要整个图片还是只是需要部分图片数据. 任何情况下, 数据参数必须包含所有累积至该点的图像文件的数据(?.
  5. 如果已经累积了足够的数据, 通过 CGImageSourceCreateImageAtIndex 创建图片, 并开始 绘制这部分图片, 然后释放掉内存.
  6. 通过调用 CGImageSourceGetStatusAtIndex来检查是否完成加载所有数据.
    • 如果已经完成加载, 返回 skCGImageStatusComplete
    • 如果未完成加载, 重复 3&4 步, 直到完成
  7. 释放 incremental image source

显示图片的属性

通过 CGImageSourceCopyPropertiesAtIndex 来获得图片资源里的图片所包含的所有属性的字典.

创建 image source, 从 CGImageSourceCopyPropertiesAtIndex 返回的 CFDictionary 对象. 该对象就是包含图片属性的键值对.

Image Destinations

image destinations 抽象了数据写操作并通过 raw buffer 减少了管理数据的需求.可以展示一张或多张图片, 并可以通过属性的方式显示为多个图片存储缩略图. 可以通过 URL, CFData object, or Quartz data consumer 创建 image destination, 设置图片数据和属性. 完成操作之后需要调用 CGImageDestinationFinalize.

设置 Image Destination 的属性

Image destination 通过 CGImageDestinationSetProperties 来设置键值对属性(CFDictionaryRef . 设置属性是可选的, 可以设置 关键字或饱和度, 曝光率或者其他想保存的值.

Image I/O 定义了大量的键来指定比较重要的值, 详情参考CGImageProperties Reference. 一般需要的图片信息都已包括.

在 Image Destination 上添加图片

先通过以下方法创建 Image Destination CGImageDestinationCreateWithURL
,CGImageDestinationCreateWithData
, or CGImageDestinationCreateWithDataConsumer. 这里需要指定 UTI 或者类似的常量.

通过 CGImageDestinationAddImage
CGImageDestinationAddImageFromSource 两个方法向 image destination 添加图片; 如果图片格式允许多图,可以持续添加.
完成添加之后,调用 CGImageDestinationFinalize 来标记添加图片介绍, 结束之后就无法继续添加图片了.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容