我有一个应用程序,需要拍摄一张照片,然后向用户展示。我打开相机,让用户使用以下代码拍照:
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];
}
问题是,在完成最后一个函数后,图像为零。起初,disseViewControllerAnimated是在函数的末尾,但在这篇SO文章中,答案解释说,应该首先调用disseViewController Animated,并在从信息中获取图像之前释放picker。我试着把disseViewControllerAnimated放在顶部,但因为我使用的是ARC,所以我无法释放picker。
如何从信息中获取图像?
您已经在代码中设置了picker.allowsEditing = NO;
。那么,为什么要检索编辑后的图像?它不会存在。无论如何,如果你允许编辑,使用这个:
photoView.image = info[UIImagePickerControllerEditedImage] ? info[UIImagePickerControllerEditedImage] : info[UIImagePickerControllerOriginalImage]
如果用户编辑了照片,则photoView.image
将设置为编辑后的照片,否则将设置为原始照片。
如果不允许编辑,只需使用UIImagePickerControllerOriginalImage
键即可检索图像。
试试这个:
UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
// or UIImage *image = [info objectForKey:@"UIImagePickerControllerEditedImage"];
检查此方法,
(void) imagePickerController:(UIImagePickerController *)_picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
NSLog(@"dictionary image info: %@",info );
}
在该方法中,打印字典并检查是否获得UIImagePickerControllerMediaType和UIImagePickerControllerOriginalImage。(在我的情况下,我得到的值如下UIImagePickerControllerMediaType="public.image";UIImagePickerControllerOriginalImage=UIImage:0x1dd79520";)
现在,如果您正在获取UIImagePickerControllerOriginalImage的值,则将值保存在此UI图像中。
现在使用这个。
UIImage *image = [info objectForKey:@"UIImagePickerControllerEditedImage"];
或
UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
希望这对你有帮助。