使用图像选取器和UIImagePickerController
图像选取器是通过名为UIImagePickerController的模式控制器类执行的。首先创建此类的一个实例,指定委托,并指定其图像源,然后以模式化方式启动他。图像选取器会控制iPhone让用户从已有的图像集中选择一副图片,或者使用照相机拍摄一副新图片。用户拍摄或者选择图像之后,就可以对所选图像进行一些基本的编辑,如缩放或裁剪。如果用户没有取消按钮,那么用户拍摄的或从库中选择的图像就会传到委托。
1.UIImagePickerController的静态方法:
/*
typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {
UIImagePickerControllerSourceTypePhotoLibrary,
UIImagePickerControllerSourceTypeCamera,
UIImagePickerControllerSourceTypeSavedPhotosAlbum
};
*/
UIImagePickerControllerSourceTypePhotoLibrary表示我们想让用户使用现有照片库之外的照片。如果所指定的源当前可用,方法isSourceTypeAvailable:将返回YES。
UIImagePickerControllerSourceTypeCamera 指定用户将使用内置的照相机拍摄图片,并将此图片返回到委托。
UIImagePickerControllerSourceTypeSavedPhotoAlbum 指定了用户将从现有照片库中选择图像,但选择范围仅限于最近的相册。
2.在确保运行程序的设备支持要使用的图像源之后,启动图像选取器就相对容易多了:
UIImagePickerController *picker=[[UIImagePickerController alloc] init];
picker.delegate=self;
picker.sourceType=UIImagePickerControllerSourceTypePhotoLibrary;
[self presentModalViewController:picker animated:YES];
[picker release];
在创建并配置了UIImagePickerController之后,我们使用类从UIView中继承的presentModalViewController:animated:方法,将图像选取器呈现给用户。
3.实现图像选取器控制器委托
用户退出图像选取器界面时,你希望获取的对象需要符合UIImagePickerControllerDelegate协议,此协议定义了两个方法,
1)imagePickerController:didFinishPickingImage:editingInfo: 第二个参数是包含用户所选照片的UIImage实例,第三个 参数是一个NSDictionary实例,如果允许编辑,并且用户裁剪或缩放了图像,那么就会传递此参数。
此字典存储在键UIImagePickerControllerOriginalImage下未编辑的原始图像。下面给出了检索原始图像的委托方法的一个例子:
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingImage:(UIImage *)image
editingInfo:(NSDictionary *)editingInfo {
UIImage *selectedImage=image;
UIImage *originalImage=[editingInfo objectForKey:UIImagePickerControllerOriginalImage];
//do something with selectedImage and originalImage
[picker dismissModalViewControllerAnimated:YES];
}
通过存储在键UIImagePickerControllerCropRect下的NSValue对象,editingInfo字典也可以指示在编辑期间选择了整个图像的哪一部分。也可以将此字符串转换至CGRect:
NSValue *cropRect=[editingInfo objectForKey:UIImagePickerControllerCropRect];
CGRect theRect=[cropRect CGRectValue];
完成转换之后,theRect可以指明在编辑过程中所选定的原始图像的部分。如果不需要此信息,则可以忽略。
2)imagePickerControllerDidCancel:
在UIImagePickerControllerDelegate协议中的两种方法都标记为可选,但实际上不是,原因是:必须通过本身解除图像选取器 这样的模式视图。因此,在用户取消图像选取器时,即使不需要采取任何应用程序特定的动作,也仍然需要解除选取器。至少,imagePickerControllerDidCancel:方法要像下面这样才能保证程序正确运行:
-
(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
[picker dismissModalViewControllerAnimated:YES];}
4.实际测试照相机和库
创建一个CameraViewController类 在CameraViewController.h中
@interface CameraViewController : UIViewController<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
{
__weak IBOutlet UIImageView *imageView;
__weak IBOutlet UIButton *takePictureButton;
__weak IBOutlet UIButton *selectFromCameraRollButton;
}
- (IBAction)getCameraPicture:(UIButton *)sender;
- (IBAction)selectExistingPicture:(UIButton *)sender;
@end
在CameraViewController.m中
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
//如果用户的设备没有照相机,则隐藏Take Picture按钮和Pick from Library按钮,只允许从照片库中选择图片
takePictureButton.hidden = YES;
selectFromCameraRollButton.hidden = YES;
}
}
- (IBAction)getCameraPicture:(UIButton *)sender {
UIImagePickerController *picker = [[UIImagePickerController alloc]init];
picker.delegate = self;
picker.allowsEditing = YES;
// picker.sourceType = (sender == takePictureButton)?UIImagePickerControllerSourceTypeCamera:UIImagePickerControllerSourceTypeSavedPhotosAlbum;
picker.sourceType =UIImagePickerControllerSourceTypeSavedPhotosAlbum;
[self presentViewController:picker animated:YES completion:nil];
}
- (IBAction)selectExistingPicture:(UIButton *)sender {
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {
UIImagePickerController *picker = [[UIImagePickerController alloc]init];
picker.delegate = self;
picker.allowsEditing = YES;
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:picker animated:YES completion:nil];
}else{
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"找不着照片" message:nil delegate:self cancelButtonTitle:@"关闭" otherButtonTitles: nil];
[alertView show];
}
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo
{
[self dismissModalViewControllerAnimated:YES];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[self dismissViewControllerAnimated:YES completion:nil];
}
5.效果图