IPhone简单的照相机和照片库

本文介绍了如何在iOS应用中使用图像选取器和UIImagePickerController来让用户从现有图片库中选择图片或使用内置相机拍摄图片。详细解释了不同图像源的使用方法、如何启动图像选取器、实现图像选取器委托以获取用户选择的图片以及处理用户取消操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用图像选取器和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.效果图








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值