UIImage, CGImageRef, CIImage

后继更新... 2016-05-24

UIImage

概述:

UIImage对象在App中管理图片数据. 使用Image对象来表示所有类型图片的数据, UIImage类具有管理相关平台支持的所有格式图片数据的能力. Image对象是不可修改的, 因此你总是通过已经存在的图片数据来创建它, 比如保存在硬件中的图片文件或通过编程创建的图片数据. 一个Image对象包含单个图片或你要用作动画的一系列图片.

你可以使用Image对象做如下操作:

  1. 为UIImageView对象访问图片以便在界面上展示出来
  2. 使用图片来自定义系统操作, 如按钮(Button), 滚动条(Slider)和分段管理(Segment)
  3. 直接在View或者其它图形上下文中绘抽图片
  4. 传递Image给其它需要图片数据的API

尽管Image对象支持本地平台的所有图片格式, 但仍推荐App尽量使用PNG或JPEG格式的图片. Image对象针对PNG和JPEG格式进行了渲染和显示的优化, 相比其它格式的图片提供了更好的性能. 因为PNG格式是无损的, 所以特别推荐在App的界面中使用该格式的图片.

图片比较

isEqual: 方法是判断两个图片的图片数据是否相同的唯一可靠方法. 即使通过同样的图片数据缓存来创建的Image对象也有可能是不同的. 唯一能判断它们是否相同的方式是使用 isEqual: 方法, 通过比较真实的图片数据.

// 加载同一张图片两次
UIImage* image1 = [UIImage imageNamed:@"MyImage"];
UIImage* image2 = [UIImage imageNamed:@"MyImage"];
 
// image对象是不同的, 但是它们的内容是一样的
if ([image1 isEqual:image2]) {
   // 直接对比两张图片的数据
}
 
if (image1 == image2) {
   // 直接进行比较是无效的, 并没有对图片数据进行对比
}

访问Image的数据

Image对象并没有提供直接访问相关的图片数据的操作. 然而, 你可以取得其它格式的图片数据给App使用. 特别的, 你可以分别使用CGImage和CIImage属性获取兼容Core Graphics和Core Image的版本的图片. 你也可以使用UIImagePNGRepresentation和UIImageJPEGRepressentation功能来生成包含PNG或JPEG的图片数据的NSData对象.


创建UIImage的几种常见方式

根据图片名创建

Description
+ (UIImage *)imageNamed:(NSString *)name
Parameters

name : 图片文件的名字, 如果是第一次加载该图片, 该方法会在应用的Main Bundle当中查找指定名字的文件. 如果是PNG图片, 可以省略文件后缀名. 其它格式的文件需要写完整的名称

Discussion

该访求查找系统缓存的指定名字的图片对象并返回最适合当前屏幕的该图片的变量. 如果缓存中并没有匹配的图片对象, 该方法会定位并加载硬件或有效的资源目录中该图片的数据, 并返回结果对象.

系统可能在任意时刻去清除图片缓存数据以释放内存. 缓存的图片数据中只有当前没有被使用的会被清除

在iOS9及以后, 该方法是线程安全.

Special Considerations

如果你的图片文件只需要显示一次并确保它不需要添加到系统的缓存当中. 你应该使用 imageWithContentsOfFile: 方法来创建图片. 这会让单次使用的图片不会被系统缓存, 从而潜在的提高App内存使用的特性.


通过图片路径创建

Description
+ (UIImage *)imageWithContentsOfFile:(NSString *)path
Parameters

path : 文件的局部或完整路径

Discussion

该方法并不会缓存图片


通过CGImage创建

Description
+ (UIImage *)imageWithCGImage:(CGImageRef)cgImage

创建并返回与指定的Quartz图片所对应的UIImage图片对象

Parameters

cgImage : Quartz Image对象

Return Value

返回与指定Quartz Image对应的新UIImage对象, 如果不能从指定的Quartz Image引用进行初始化, 则返回nil

Discussion
 该方法会不缓存图片对象. 可以使用Core Graphics框架中对应方法来创建Quartz图片引用

通过CIImage创建

Description
+ (UIImage *)imageWithCIImage:(CIImage *)ciImage

创建并返回包含Core Image对象的UIImage对象

Parameters

ciImage : 用来封装的Core Image对象

Return Value

返回一个新的图片对象


Image的属性

imageOrientation
@property(nonatomic, readonly) UIImageOrientation imageOrientation

图片的方向. (只读属性)

Discussion

图片的方向会影响图片数据进行绘制时的方式. 默认情况下, 图片是"向上"的方向进行展示的. 如果图片有与之关联的元数据(metadata)(比如EXIF信息), 则该属性包含了元数据所指示的方向. 该属性的可用参数类型列表, 可以查看UIImageOrientation

typedef enum {
   UIImageOrientationUp,
   UIImageOrientationDown , 
   UIImageOrientationLeft ,   
   UIImageOrientationRight ,  
   UIImageOrientationUpMirrored ,  
   UIImageOrientationDownMirrored ,  
   UIImageOrientationLeftMirrored , 
   UIImageOrientationRightMirrored , 
} UIImageOrientation;
  • UIImageOrientationUp
    默认的图片方向, 图片正面朝上绘制.


    UIImageOrientationUp
  • UIImageOrientationDown
    图片旋转180度.


    UIImageOrientationDown
  • UIImageOrientationLeft
    图片顺时针旋转90度.
    UIImageOrientationLeft
  • UIImageOrientationRight
    图片逆时针旋转90度.


    UIImageOrientationRight
  • UIImageOrientationUpMirrored
    以UIImageOrientationUp方向进行绘制图片的镜面反射版本. 也就是沿着Y轴进行水平翻转.


    UIImageOrientationUpMirrored
  • UIImageOrientationDownMirrored
    以UIImageOrientationDown方向进行绘制图片的镜面反射版本. 也就是沿着Y轴进行水平翻转.


    UIImageOrientationDownMirrored.jpg
  • UIImageOrientationLeftMirrored
    以UIImageOrientationLeft方向进行绘制图片的镜面反射版本. 相当于将"Up"方向图片沿着Y轴水平翻转, 再逆时针旋转90.


    UIImageOrientationLeftMirrored
  • UIImageOrientationRightMirrored
    以UIImageOrientationRight方向进行绘制图片的镜面反射版本. 相当于将"Up"方向图片沿着Y轴水平翻转, 再顺时针旋转90.


    UIImageOrientationRightMirrored
EXIF(Exchangeable Image File Format)

可交换图像文件格式, 可记录照片的属性信息(宽度, 高度, 方向等)和拍摄数据(图片数据). EXIF可附加于JPEG, TIFF, RIFF等文件之中, 但PNG格式的图像不包含.


scale
@property(nonatomic, readonly) CGFloat scale

图片的拉伸系数. (只读属性)

Discussion

如果你从一个名称包含@2X修饰的文件中加载图片, 则scale会被设置成2.0. 你也可以在从Core Graphics Image初始化一张图片时直接显式的指定拉伸系数(scale factor). 所有其它的图片都假定其拉伸系数为1.0.
如果你将图片的逻辑尺寸(保存在size属性中)乘以拉伸比例(scale属性), 会得到图片实际的像素尺寸.


size
@property(nonatomic, readonly) CGSize size

图片的逻辑尺寸, 以点为单位进行测量. (只读属性)

Discussion

该值表示图片的逻辑大小, 并将图片当前方向考虑进去. 将size的值乘以scale属性的值可以得到图片的像素尺寸.


CGImage

CGImageRef是一种基于你所提供的样本数据来表示位图(Bitmap Image)和位图遮罩(Bitmap Image Masks)的具体类型. 位图(样本)是像素的矩形阵列(Rectangular Array), 每个像素表示源图中的每个点的数据或样本.


CIImage

CIImage类用于描述一张图片. CoreImage的图片是不可变的. 通过将CIImage对象与其它Core Image的类(比如CIFilter, CIContext, CIVector, 和CIColor)结合, 实现利用Core Image内建的滤镜来进行图片处理. 根据多种来源提供的数据来创建CIImage对象, 包括Quartz 2D, Core Video图像缓存(CVImageBufferRef), 基于URL的对象, 和NSData对象.
尽管CIImage对象拥有与之关联的图片数据, 但本质上并不是一张图片. 你可以它CIImage对象为一个图片的"配方". CIImage对象拥有生成一张图片所具备的所有信息, 但Core Image并不会真正的去渲染一张图片, 除非被要求这么做. 这种"延迟计算(lzay evaluation)"方式让Core Image的操作尽可能的高效.
CIContext和CIImage对象都是不可修改的, 意味着它们可以在线程之间安全的共享. 多个线程可以使用同样的GPU或者CPU的CIContext对象来渲染CIImage对象. 然而, CIFilter对象的情况则不同, 它是可以被修改的. CIFilter对象不能在线程之间安全的共享. 如果你的App是支持多线程的, 每一个线程都需要创建自己的CIFilter对象. 否则App的行为将出乎你的意料.
Core Image提供了为图片分析常见缺陷并自动调整修复的方法. 提供一系列用来纠正这些不足的滤镜. 通过为滤镜预设相关值, 实现如变更色调, 饱合度, 对比度, 阴影, 去除红眼或其它闪光伪迹, 来提高图片的质量.

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

推荐阅读更多精彩内容

  • 官方文档点蓝色文字:UIImage、CIImage、CGImage。 这篇文章是对官方文档的学习笔记,不是翻译,对...
    阿斯兰iOS阅读 6,389评论 1 8
  • 许多UIView的子类,如一个UIButton或一个UILabel,它们知道怎么绘制自己。迟早,你也将想要做一些自...
    shenzhenboy阅读 1,621评论 2 8
  • Core Image是一个强大的框架,它能够让你轻松地对图像进行过滤。你能够通过修改图像的饱和度、色调或曝光率来获...
    木易林1阅读 1,121评论 0 1
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 前言 最近在研究 Core Image 自定义 Filter 相关内容,重新学习了 Core Image,对 Co...
    泥孩儿0107阅读 751评论 0 4