Search code examples
ioscamerauiimagepickercontrolleroverlay-view

UIImagePickerController overlayview upside down in preview


I want to add an overlay view when capturing a photo. I can successfully add the overlay view, and capture the photo.

After tapping on capture button, the preview is shown. In that preview screen, the overlay view is upside down (around 20 to 30px).

When selecting the use button, the image taken is saved in the photo album. In it, the image is fine. It's upside down only during the preview.

I attached the code below, please guide me to my mistake.

-(void)viewDidLoad {

// ...
// Some other actions...

OverlayView *overlay = [[OverlayView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];

UIImagePickerController *picker = [[UIImagePickerController alloc] init];

picker.sourceType = UIImagePickerControllerSourceTypeCamera;

picker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto;

[picker setDelegate:self];  
picker.showsCameraControls = YES;
picker.navigationBarHidden = YES;
picker.toolbarHidden = YES;

picker.wantsFullScreenLayout = YES;

picker.cameraViewTransform = CGAffineTransformScale(picker.cameraViewTransform, 1.24299, 1.24299 );

picker.cameraOverlayView = overlay;

[self presentModalViewController:picker animated:YES];  
[picker release];

}

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    // Access the uncropped image from info dictionary
UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];

// Save image
    UIImage *overlayImage  = [UIImage imageNamed:@"img3.png"]; //foverlayImage image

    CGSize newSize = image.size;
    UIGraphicsBeginImageContext( newSize );

    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];

    // Apply supplied opacity if applicable
    [overlayImage drawInRect:CGRectMake(0,0,newSize.width,newSize.height) blendMode:kCGBlendModeNormal alpha:1.0];

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    UIImageWriteToSavedPhotosAlbum(newImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);

}


- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
UIAlertView *alert;

// Unable to save the image  
if (error)
    alert = [[UIAlertView alloc] initWithTitle:@"Error" 
                                           message:@"Unable to save image to Photo Album." 
                                          delegate:self cancelButtonTitle:@"Ok" 
                                 otherButtonTitles:nil];
    // All is well
else 
        alert = [[UIAlertView alloc] initWithTitle:@"Success" 
                                           message:@"Image saved to Photo Album." 
                                          delegate:self cancelButtonTitle:@"Ok" 
                                 otherButtonTitles:nil];

    [alert show];
    alert.delegate = self;
    [alert release];
}

In OverlayView.m

- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        // Clear the background of the overlay:
        self.opaque = NO;
        self.backgroundColor = [UIColor clearColor];

        // Load the image to show in the overlay:
        UIImage *overlayGraphic = [UIImage imageNamed:@"img3.png"];
        UIImageView *overlayGraphicView = [[UIImageView alloc] initWithImage:overlayGraphic];
        overlayGraphicView.frame = CGRectMake(0, 0, 320, 460);
        [self addSubview:overlayGraphicView];
        [overlayGraphicView release];

    }

    return self;
}

Thanks in advance.


Solution

  • Hey I was searching for the same thing and came across this link which explains why it seems to be upside down! Hope it helps http://trandangkhoa.blogspot.co.uk/2009/07/iphone-os-drawing-image-and-stupid.html