您的位置:首页 > 产品设计 > UI/UE

【IOS 开发学习总结-OC-63】UIImage 与 CGImage,CGImageRef

2015-10-21 22:32 686 查看

【IOS 开发学习总结-OC-63】UIImage 与 CGImage,CGImageRef

UIImage 专门用来显示各种位图,支持的图片格式有:



当系统内存紧张时,UIImage会将图片数据从UIImage对象中清理出去来节省内存使用——但不清理对象本身。当程序使用一个图片被清理后的UIImage对象时,该UIImage会自动从原始的图片文件中加载图片数据。

注意:尽量避免UIImage加载过大(比如1024x1024)的图片,如果实在需要加载这种大图片,可以考虑将图片分解成多张小图进行加载。

用UIImage显示静止的图片,可以使用UIImage提供的如下常用类方法:

1.
+ (nullable UIImage *)imageNamed:(NSString *)name;
// load from main bundle ——用于加载指定文件名对应的图片。该方法有缓存机制,如果该方法试图加载的图片文件不存在,它才会去加载并缓存图片文件;如果已经缓存过,该方法将直接使用已缓存的图片。

说明:若程序需要频繁的加载,卸载图片时,不该使用该方法加载图片。

+ (nullable UIImage *)imageWithContentsOfFile:(NSString *)path;
——加载指定文件名对应的图片

+ (nullable UIImage *)imageWithData:(NSData *)data;
——根据NSData封装的图片数据来创建图片

+ (nullable UIImage *)imageWithData:(NSData *)data scale:(CGFloat)scale NS_AVAILABLE_IOS(6_0);
——根据NSData封装的图片数据来创建图片,并按指定的缩放因子进行缩放

+ (UIImage *)imageWithCGImage:(CGImageRef)cgImage;
——根据指定的CGImageRef对象来创建UIImage

+ (UIImage *)imageWithCGImage:(CGImageRef)cgImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation NS_AVAILABLE_IOS(4_0);
——根据指定的CGImageRef对象来创建UIImage,并按指定方向用指定的缩放因子进行缩放

+ (UIImage *)imageWithCIImage:(CIImage *)ciImage NS_AVAILABLE_IOS(5_0);
——根据指定的CIImage对象来创建UIImage

+ (UIImage *)imageWithCIImage:(CIImage *)ciImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation NS_AVAILABLE_IOS(6_0);
——根据指定的CIImage对象来创建UIImage,并按指定方向用指定的缩放因子进行缩放

对UIImage读取图片的分类

应用资源包种读取图片——借助
imageNamed:
方法读取

如:
UIImage *abc=[UIImage imageNamed:@"abc.png"];


从网络中读取图片——可借助 NSData 的方法加载指定 URL 对应的网络数据

示例代码:

NSURL *url=[NSURL URLWithString:@"http://www.abc.com/haha.png"];
NSData *data=[NSData dataWithContentsOfURL:url];
UIImage *image=[UIImage imageWithData:data];


从手机本地读取图片

示例代码:

NSString *path=[[NSHomeDirectory() stringByAppendingPathComponent:@"document"] stringByAppendingPathComponent:@"abc.png"];
UIImage *image=[UIImage imageWithContentsOfFile:path];


UIImage实现动画显示多张图片

UIImage可以加载多张图片,并按指定时间间隔依次显示多张图片,就可以实现动画效果。UIImage提供了如下方法:

-
+ (nullable UIImage *)animatedImageNamed:(NSString *)name duration:(NSTimeInterval)duration NS_AVAILABLE_IOS(5_0);
——根据指定的图片名加载系列图片。如,该方法的第一个参数名 为 book(即代表以 该字符串开头),该方法会自动加载 book0.png, book1.png, book2.png 等图片。

// read sequence of files with suffix starting at 0 or 1

+ (nullable UIImage *)animatedResizableImageNamed:(NSString *)name capInsets:(UIEdgeInsets)capInsets duration:(NSTimeInterval)duration NS_AVAILABLE_IOS(5_0); // sequence of files


//创建一个在可变大小的图片上指定矩形区域内的动态图片

+ (nullable UIImage *)animatedResizableImageNamed:(NSString *)name capInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode duration:(NSTimeInterval)duration NS_AVAILABLE_IOS(6_0);


//同上,只是多了一个图片变化的方式,具体来说就是平铺或者拉伸

+ (nullable UIImage *)animatedImageWithImages:(NSArray<UIImage *> *)images duration:(NSTimeInterval)duration NS_AVAILABLE_IOS(5_0);


——传入一个图片数组。该数组中的元素都是UIImage对象。

CGImageRef 与 CGImage

UIImage虽然可以实现上面说的一些功能,但功能依然有限。它不能对图片进行缩放,旋转,不同截取图片的指定区域等。这些功能可以借助 Quartz2D的CGImageRef来实现。

UIImage与CGImageRef可以相互转换。CGImageRef只是个指针类型,并不是面向对象的 API,也不是个类。——Quartz2D对CGImageRef的定义:
typedef struct CGImage *CGImageRef;


如何转换?

1. 如果已经有UIImage,调用UIImage的 CGImage 方法获取它封装的CGImageRef。如下代码片:

UIImage *imagePP=[UIImage imageWithData:data];
CGImageRef cif=[imagePP CGImage];


如果已经有CGImageRef,调用UIImage的
imageWithCGImage:
方法加载图片即可。如下代码片:

CGImageRef cif=[imagePP CGImage];
UIImage *abcImage=[UIImage imageWithCGImage:cif];


补充学习资料:

ios下UIImage相关开发经验总结
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios 开发 uiimage 图片