图像选择器(UIImagePickerController)显示用户的照片库,用户选择照片后,图像选择器返回一个相应的UIImage对象。
要显示图像选择器,可分配并初始化一个UIImagePickerController实例,再设置属性sourceType,以指定用户可从哪些地方选择图像。
UIImagePickerControllerSourceTypeCamera — 相机拍摄
UIImagePickerControllerSourceTypePhotoLibrary — 照片库
UIImagePickerControllerSourceTypeSavedPhotosAlbum — 相机胶卷
照片库除了包含相机胶卷,还有来自其它App创建的图片文件夹:
触发图像选择器的一般实现方法:
- (IBAction)btnTestHandler:(id)sender { UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; imagePicker.delegate = self; imagePicker.allowsEditing = YES; [self presentViewController:imagePicker animated:YES completion:nil]; [[UIApplication sharedApplication] setStatusBarHidden:YES]; //在iOS7下这句代码无效。 }
要在用户选择图像或取消选择图像时采取相应的措施。首先要为UIImagePickerController实例的delegate属性指定一个类,该类需要遵守协议UIImagePickerControllerDelegate,并实现相应的方法。同时要遵守导航控制器委托UINavigationControllerDelegate,但无需实现该协议的任何方法。
@interface ViewController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate>
用户在图像选择器中做出选择时,将自动调用方法imagePickerController:didFinishPickingMediaWithInfo。这个方法接收到了一个NSDictionary对象,它可能包含多项信息:图像本身、编辑后的图像版本(如果允许裁剪/缩放)或有关图像的信息。要获取所需的信息,必须提供相应的键。例如,要获取选定的图像(UIImage),需要使用UIImagePickerControllerOriginalImage键。
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { [self dismissViewControllerAnimated:YES completion:nil]; UIImage *chosenImage = [info objectForKey:UIImagePickerControllerOriginalImage]; //Do something with the image here }
用户取消选择图像,会调用到方法imagePickerControllerDidCancel
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { [self dismissViewControllerAnimated:YES completion:nil]; }
Core Image框架是iOS 5.0新增的,它提供了一些非破坏性方法,让您能够将滤镜应用于图像以及执行其他类型的图像分析。要在应用程序使用Core Image,首先需要添加Core Image框架,再导入其接口文件:
#import <CoreImage/CoreImage.h>
Core Image框架最常用的一个操作是给图像添加滤镜,Core Image定义了一种新的非破坏性图像类型CIImage,而比较常用的类型是UIImage(通常存在于UIImageView),这两种类型是可以互相转换的:
CIImage *imageToFilter = [[CIImage alloc] initWithImage:self.myImageView.image];
UIImage *myImage = [UIImage imageWithCIImage:imageToFilter];
要应用滤镜,必须知道滤镜的名称及其所需的参数。例如,Core Image棕色滤镜名为CISepiaTone,它接受一个名为inputIntensity的参数,该参数的取值为0.0和1.0之间的数字(值越大滤镜越强烈),下面的代码为一副图片添加了棕色滤镜:
CIImage *inputImage = [[CIImage alloc] initWithImage:self.myImageView.image]; CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone"]; [filter setDefaults]; [filter setValue:[NSNumber numberWithFloat:1.0] forKey:@"inputIntensity"]; [filter setValue:inputImage forKey:@"inputImage"]; CIImage *outputImage = [filter valueForKey:@"outputImage"]; self.myImageView.image = [UIImage imageWithCIImage:outputImage];