I am working to capture an image that is returned in 4.0 using
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { [[picker parentViewController] dismissModalViewControllerAnimated:YES]; // MediaType can be kUTTypeImage or kUTTypeMovie. If it's a movie then you // can get the URL to the actual file itself. This example only looks for images. // NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType]; // NSString* videoUrl = [info objectForKey:UIImagePickerControllerMediaURL]; // Try getting the edited image first. If it doesn't exist then you get the // original image. // if (CFStringCompare((CFStringRef) mediaType, kUTTypeImage, 0) == kCFCompareEqualTo) { UIImage* picture = [info objectForKey:UIImagePickerControllerEditedImage]; if (!picture) picture = [info objectForKey:UIImagePickerControllerOriginalImage]; // **picture is always nil // info dictionary count = 1 } }
What is happening is that the info dictionary always returns with a single entry:
{ UIImagePickerControllerMediaType = "public.image";
which is great, but there is never an image.
I was using a great example from this forum to do this, and I am pretty sure the calls are correct, but never an image.
Thanks in advance!
I know this is many months later, but I struggled with this for hours, and found this same question all over this site and iphonedevsdk.com, but never with a working answer.
To summarize, if the image was picked from the camera roll/photo library it worked fine, but if the image was a new photo take with the camera it never worked. Well, here's how to make it work for both:
You have to dismiss and release the UIImagePickerController before you try to do anything with the info dictionary. To be super-clear:
This DOES NOT work:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { // No good with the edited image (if you allowed editing) myUIImageView.image = [info objectForKey:UIImagePickerControllerEditedImage]; // AND no good with the original image myUIImageView.image = [info objectForKey:UIImagePickerControllerOriginalImage]; // AND no doing some other kind of assignment UIImage *myImage = [info objectForKey:UIImagePickerControllerEditedImage]; [picker dismissModalViewControllerAnimated:YES]; [picker release]; }
In all of those cases the image will be nil.
However, via the magic of releasing the UIImagePickerController first...
This DOES work:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { [picker dismissModalViewControllerAnimated:YES]; [picker release]; // Edited image works great (if you allowed editing) myUIImageView.image = [info objectForKey:UIImagePickerControllerEditedImage]; // AND the original image works great myUIImageView.image = [info objectForKey:UIImagePickerControllerOriginalImage]; // AND do whatever you want with it, (NSDictionary *)info is fine now UIImage *myImage = [info objectForKey:UIImagePickerControllerEditedImage]; }
Crazy simple, but that's all there is to it.
whilst Matthew Frederick's answer is most popular and has long been the appropriate response, as of iOS 5.0, apple made available dismissViewControllerAnimated:completion:
, to replace the now deprecated (as of iOS 6.0) dismissViewControllerAnimated:
.
performing the image info dictionary retrieval in the completion block should hopefully make more sense to all.
to take his example from above, it would now look like:
- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { [picker dismissViewControllerAnimated:YES completion:^{ // Edited image works great (if you allowed editing) myUIImageView.image = [info objectForKey:UIImagePickerControllerEditedImage]; // AND the original image works great myUIImageView.image = [info objectForKey:UIImagePickerControllerOriginalImage]; // AND do whatever you want with it, (NSDictionary *)info is fine now UIImage *myImage = [info objectForKey:UIImagePickerControllerEditedImage]; }]; }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With