Ios 如何在启用ARC的情况下检索使用UIImagePickerControllerDelegate拍摄的图像?

Ios 如何在启用ARC的情况下检索使用UIImagePickerControllerDelegate拍摄的图像?,ios,objective-c,Ios,Objective C,我有一个应用程序,需要拍摄一张照片,然后显示给用户。我打开相机,让用户使用以下代码拍照: if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) { UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; imagePicker.delegate =

我有一个应用程序,需要拍摄一张照片,然后显示给用户。我打开相机,让用户使用以下代码拍照:

if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) {
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.sourceType =
    UIImagePickerControllerSourceTypeCamera;
    imagePicker.mediaTypes = @[(NSString *) kUTTypeImage];
    imagePicker.allowsEditing = NO;
    imagePicker.modalPresentationStyle = UIModalPresentationFullScreen;

    [self presentViewController:imagePicker animated:YES completion:nil];
} else {
    UIAlertView *alert = [[UIAlertView alloc]
                          initWithTitle: @"Camera failed to open"
                          message: @"Camera is not available"
                          delegate: nil
                          cancelButtonTitle:@"OK"
                          otherButtonTitles:nil];
    [alert show];
}
这将显示相机视图,以便用户可以拍照。我实现了处理取消和完成事件的方法,如下所示:

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    [self dismissViewControllerAnimated:YES completion:nil];

    UIImage * image = [info objectForKey:UIImagePickerControllerEditedImage];
    [photoView setImage:image];
    [photoView setNeedsDisplay];
}
问题是,经过最后一个函数后,图像为零。起初dismissViewControllerAnimated位于函数的末尾,但在回答中解释了应该首先调用dismissViewControllerAnimated,并且应该在从info获取图像之前释放picker。我尝试将dismissViewControllerAnimated放在顶部,但因为我使用的是ARC,所以无法释放选择器

如何从信息中获取图像?

试试以下方法:

UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
// or UIImage *image = [info objectForKey:@"UIImagePickerControllerEditedImage"];
试试这个:

UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
// or UIImage *image = [info objectForKey:@"UIImagePickerControllerEditedImage"];

您已设置
picker.allowsdediting=NO在您的代码中。那么,为什么要检索已编辑的图像?它不会存在。无论如何,如果允许编辑,请使用以下命令:

photoView.image = info[UIImagePickerControllerEditedImage] ? info[UIImagePickerControllerEditedImage] : info[UIImagePickerControllerOriginalImage]
如果用户已编辑照片,
photoView.image
将设置为已编辑的照片,否则将设置为原始照片


如果不允许编辑,只需使用
UIImagePickerControllerOriginalImage
键检索图像即可。

您已设置
picker.AllowsEdit=NO在您的代码中。那么,为什么要检索已编辑的图像?它不会存在。无论如何,如果允许编辑,请使用以下命令:

photoView.image = info[UIImagePickerControllerEditedImage] ? info[UIImagePickerControllerEditedImage] : info[UIImagePickerControllerOriginalImage]
如果用户已编辑照片,
photoView.image
将设置为已编辑的照片,否则将设置为原始照片

如果不允许编辑,只需使用
UIImagePickerControllerOriginalImage
键检索图像即可。

选中此方法

 (void) imagePickerController:(UIImagePickerController *)_picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
      NSLog(@"dictionary image info: %@",info );
    }
在此方法中,打印字典并检查您是否获得UIImagePickerControllerMediaTypeUIImagePickerControllerOriginalImage。 (在我的例子中,我得到的值如下UIImagePickerControllerMediaType=“public.image”; UIImagePickerController原始图像=UIImage:0x1dd79520“

现在,如果您正在获取UIImagePickerControllerOriginalImage的值,则将值保存在此UIImage

现在用这个

UIImage *image = [info objectForKey:@"UIImagePickerControllerEditedImage"];

希望这会对您有所帮助。

检查此方法

 (void) imagePickerController:(UIImagePickerController *)_picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
      NSLog(@"dictionary image info: %@",info );
    }
在此方法中,打印字典并检查您是否获得UIImagePickerControllerMediaTypeUIImagePickerControllerOriginalImage。 (在我的例子中,我得到的值如下UIImagePickerControllerMediaType=“public.image”; UIImagePickerController原始图像=UIImage:0x1dd79520“

现在,如果您正在获取UIImagePickerControllerOriginalImage的值,则将值保存在此UIImage

现在用这个

UIImage *image = [info objectForKey:@"UIImagePickerControllerEditedImage"];


希望这能对你有所帮助。

这篇文章建议你在解雇后停止工作,以获得照片。你试过了吗?在关闭控制器之前使用你的代码获取一个图像。帖子建议你关闭后的块完成获取图像。您尝试过吗?在关闭控制器之前,使用您的代码获取图像。不允许编辑图像
imagePicker.allowsdediting=NO所以只需要检查原始图像。@selmad抱歉,没有收到您的信息。“你什么意思?”塞尔玛更新了我的答案。谢谢,谢谢,这很有效。这就是我从互联网上愚蠢地复制粘贴内容所得到的结果,它不允许编辑图像
imagePicker.allowsdediting=NO所以只需要检查原始图像。@selmad抱歉,没有收到您的信息。“你什么意思?”塞尔玛更新了我的答案。谢谢,谢谢,这很有效。这就是我愚蠢地从互联网上复制粘贴东西所得到的>