后继更新... 2016-05-24
UIImage
概述:
UIImage对象在App中管理图片数据. 使用Image对象来表示所有类型图片的数据, UIImage类具有管理相关平台支持的所有格式图片数据的能力. Image对象是不可修改的, 因此你总是通过已经存在的图片数据来创建它, 比如保存在硬件中的图片文件或通过编程创建的图片数据. 一个Image对象包含单个图片或你要用作动画的一系列图片.
你可以使用Image对象做如下操作:
- 为UIImageView对象访问图片以便在界面上展示出来
- 使用图片来自定义系统操作, 如按钮(Button), 滚动条(Slider)和分段管理(Segment)
- 直接在View或者其它图形上下文中绘抽图片
- 传递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
默认的图片方向, 图片正面朝上绘制.
-
UIImageOrientationDown
图片旋转180度.
- UIImageOrientationLeft
图片顺时针旋转90度.
-
UIImageOrientationRight
图片逆时针旋转90度.
-
UIImageOrientationUpMirrored
以UIImageOrientationUp方向进行绘制图片的镜面反射版本. 也就是沿着Y轴进行水平翻转.
-
UIImageOrientationDownMirrored
以UIImageOrientationDown方向进行绘制图片的镜面反射版本. 也就是沿着Y轴进行水平翻转.
-
UIImageOrientationLeftMirrored
以UIImageOrientationLeft方向进行绘制图片的镜面反射版本. 相当于将"Up"方向图片沿着Y轴水平翻转, 再逆时针旋转90.
-
UIImageOrientationRightMirrored
以UIImageOrientationRight方向进行绘制图片的镜面反射版本. 相当于将"Up"方向图片沿着Y轴水平翻转, 再顺时针旋转90.
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提供了为图片分析常见缺陷并自动调整修复的方法. 提供一系列用来纠正这些不足的滤镜. 通过为滤镜预设相关值, 实现如变更色调, 饱合度, 对比度, 阴影, 去除红眼或其它闪光伪迹, 来提高图片的质量.