When I take photo using UIImagePickerController, there is more picture than was visible on screen... How can I take photo/crop it, so that it's exactly the same as I saw on screen?
edit: I'll add code, to specify my problem:
- (void)showImagePickerForSourceType:(UIImagePickerControllerSourceType)sourceType
{
UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext;
imagePickerController.sourceType = sourceType;
imagePickerController.delegate = self;
imagePickerController.showsCameraControls = NO;
imagePickerController.allowsEditing = YES;
if (sourceType == UIImagePickerControllerSourceTypeCamera)
{
[[NSBundle mainBundle] loadNibNamed:@"OverlayView" owner:self options:nil];
self.overlayView.frame = imagePickerController.cameraOverlayView.frame;
imagePickerController.cameraOverlayView = self.overlayView;
//self.overlayView = nil;
self.overlayImage.image = self.imageView.image;
self.overlayImage.alpha = 0.5;
UISlider *slider=[[UISlider alloc]initWithFrame:CGRectMake(60, 80, 200, 30)];
[slider setMaximumValue:1.0];
[slider setMinimumValue:0.0];
[slider setValue:0.5];
[slider addTarget:self action:@selector(sliderChanged:) forControlEvents:UIControlEventValueChanged];
if (self.working == TRUE)
{
[imagePickerController.cameraOverlayView addSubview:self.overlayImage];
[imagePickerController.cameraOverlayView addSubview:slider];
}
}
self.imagePickerController = imagePickerController;
[self presentViewController:self.imagePickerController animated:YES completion:nil];
}
didFinishPickingMediaWithInfo:
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
[self dismissViewControllerAnimated:YES completion:NULL];
//this works, image is displayed
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
//this doesn't work, image is nil
UIImage *image = [info objecyForKey:UIImagePickerControllerEditedImage];
[self.imageView setImage:image];
self.working = TRUE;
self.imagePickerController = nil;
//[self dismissViewControllerAnimated:YES completion:NULL];
}
Can I use UIImagePickerControllerEditedImage, when imagePickerController.showsCameraControls = NO;
?
Just posting this as an answer, but I am not sure if the poster asks for the edited image.
When you take a picture with the UIImagePickerController, the picker shows only part of the image that is actually captured when taking the photo, like shown in the picture below where the black lines are the screen of the iPhone.
The image you get from the camera is the full size image, but on screen is only the center of the image, with either the width or the height of the image maxed out to the screen size.
All you need to do is get the center from the image like shown above and you have the exact image you had on your screen.
After Wim's answer, I was able to come up with solution like this:
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
UIGraphicsBeginImageContext(CGSizeMake(720, 960));
[image drawInRect: CGRectMake(0, 0, 720, 960)];
UIImage *smallImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
CGRect cropRect = CGRectMake(40, 0, 640, 960);
CGImageRef imageRef = CGImageCreateWithImageInRect([smallImage CGImage], cropRect);
[self.imageView setImage:[UIImage imageWithCGImage:imageRef]];
As you can see, this is made for 3,5" iPhone screen, and it seems to work, but code is device-dependent, or is there better solution?
You can get the original or cropped image depending on the key for info dictionary.
The pickedImageEdited
would be the cropped image you are looking for and pickedImageOriginal
would be the full original image.
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *pickedImageOriginal = [info objectForKey:UIImagePickerControllerOriginalImage];
UIImage *pickedImageEdited = [info objectForKey:UIImagePickerControllerEditedImage];
//do your stuff
[self dismissViewControllerAnimated:YES completion:nil];
}
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