Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to crop UIImagePickerController taken picture as it is on display

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;?

like image 741
Adam Bardon Avatar asked Sep 21 '13 11:09

Adam Bardon


3 Answers

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.

enter image description here

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.

like image 106
Wim Haanstra Avatar answered Sep 28 '22 12:09

Wim Haanstra


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?

like image 34
Adam Bardon Avatar answered Sep 28 '22 10:09

Adam Bardon


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];
}
like image 28
Rok Jarc Avatar answered Sep 28 '22 10:09

Rok Jarc