3.1使用图像
为了便于操作图像IOS中定义图像类,UIImage饰UIKit框架中定义的图像类,其封装了高层次图像类,可以通过多种方式创建这些对象。在Core Graphics框架(或Quartz 2D)中也定义了CGImage,它表示位图图像,因为CGImage被封装起来了,所以通常通过CGImageRef来使用CGImage。
除了UIImage和CGImage,在Core Image框架中也有一个图像类CIImage,CIImage封装的图像类能够很好地进行图像效果处理,例如,滤镜的使用。UIImage、CGImage和CIImage之间可以相互转化,这个过程中需要注意内存释放问题,特别是CGImage与UIImage之间转化,涉及从C变量到OC对象转化,如果这里使用了ARC技术,反而会使内存释放问题更复杂,随着后面的学习逐步了解这些内存释放问题。
3.1.1 创建图像
如果一个icon.png文件放在应用程序包中(资源文件)加载图像,可以通过下面的几种代码实现:
UIImage *image = [UIImage imageNamed:@"icon.png"];
NSString *path = [[NSBundle mainBundle] pathForResource:@"icon" ofType:@"png"];
UIImage *image = [UIImage imageWithContentsOfFile:path];
或
UIImage *image = [[UIImage alloc]initWithContentsOfFile:path];
NSString *path = [[NSBundle mainBundle] pathForResource:@"icon" ofType:@"png"];
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
UIImage *image = [UIImage imageWithData:data];
或
UIImage *image = [[UIImage alloc ]initWithData:data];
如果icon.png文件放在应用程序杀箱目录中国年的Document目录下面,可以通过下面的几种代码实现:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[paths lastObject] stringByAppendingPathComponent:@"icon.png"];
UIImage *image = [UIImage imageWithContentsOfFile:path];
或
UIImage *image = [[UIImage alloc] initWithContentsOfFile:path];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[paths lastObject] stringByAppendingPathComponent:@"icon.png"];
NSData *data = [[NSData alloc] initWithContentsOfFile:path];
UIImage *image = [UIImage imageWithData:data];
或
UIImage *image = [[UIImage alloc] initWithData:data];
在上述代码中获得应用程序沙箱目录中国年Document目录语句如下:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [[paths lastObject] stringByAppendingPathComponent:@"icon.png"];
如果icon.png文件放在云端服务器端http://xxx/icon.png下,可以通过如下的几种方式创建UIImage图像对象
NSURL *url = [NSURL URLWithString:@"http://xxx/icon.png"];
NSData *data = [[NSData alloc] initWithContentsOfURL:url];
UIImage *image = [UIImage imageWithData:data];
或
UIImage *image = [[UIImage alloc] initWithData:data];
3.1.2 从设备图片库选取或从照相机抓取
UIKit中提供了一个图像选择器UIImagePickerController,UIImagePickerController不仅不可实现选取图像,还可以从相簿和相机胶卷中选择。相簿和相机胶卷是有区别的,相簿包含了相机胶卷。相簿可以查看所有图片,而相机胶卷是通过照相机拍摄或截屏获得的图片。
UIImagePickerController的主要属性是sourceType,sourceType属性是在枚举UIImagePickerControllerSourceType中定义的三个常量:
- UIImagePickerControllerSourceTypePhotoLibrary设置图片来源于”相簿”
- UIImagePickerControllerSourceTypeCamera设置图片来源于”照相机”
- UIImagePickerControllerSourceTypeSavePhotosAlbum设置图片来源于”相机胶卷”
UIImagePickerController委托对象需要实现UIImagePickerControllerDelegate委托协议。UIImagePickerControllerDelegate中定义了以下两个方法:
- -imagePickerController:didFinishPickerMediaWithInfo:当选择完成时调用
- -imagePickerControllerDidCancel:当选择取消时调用
下面通过一个实例具体介绍:
ViewController.h
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
@property (strong, nonatomic) UIImagePickerController *imagePicker;
@property (retain, nonatomic) IBOutlet UIImageView *imageView;
- (IBAction)pickPhotoLibrary:(id)sender;
- (IBAction)pickPhotoCamera:(id)sender;
@end
在.h文件的文件声明实现UIImagePickerControllerDelegate和UINavigationControllerDelegate委托协议,其中UINavigationControllerDelegate也是UIImagePickerControllerDelegate属性要求实现的协议,UINavigationControllerDelegate协议定义了两个方