0

I am doing an app where I will take the picture from camera or camera roll and masking with mask image but how i can adjust image or mask ? i tried scrollview for zoom in and out and pinch gesture ?

- (void)viewDidLoad
{
    [super viewDidLoad];

    // for zoomin
    [self.imageview setImage:imageView.image];
    [self.scrollView setMaximumZoomScale:5.0f];
    [self.scrollView setClipsToBounds:YES];


    // for drag
    UIPinchGestureRecognizer *pinch=[[UIPinchGestureRecognizer alloc]initWithTarget:self     action:@selector(pinched:)];
    [self.imageview addGestureRecognizer:pinch];

}


- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return self.imageview;
}

- (void)pinched:(UIPinchGestureRecognizer *)sender {
    if (sender.scale >1.0f && sender.scale < 2.5f) {
        CGAffineTransform transform = CGAffineTransformMakeScale(sender.scale, sender.scale);
        imageView.transform = transform;
     }
 }

-(IBAction)camera:(id)sender {
    picker = [[UIImagePickerController alloc]init];
    picker.delegate = self;

    [picker setSourceType:(UIImagePickerControllerSourceTypeCamera)];
    [self presentViewController:picker1 animated:YES completion:NULL];
}

- (void)imagePickerController:(UIImagePickerController *)photoPicker     didFinishPickingMediaWithInfo:(NSDictionary *)info {

    img = [info valueForKey:UIImagePickerControllerOriginalImage];
    [self.imageview setImage:img];
    [self dismissViewControllerAnimated:YES completion:NULL];
}

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [picker dismissViewControllerAnimated:YES completion:NULL];
}
  - (UIImage*) maskImage:(UIImage *) image withMask:(UIImage *) mask
{
CGImageRef imageReference = image.CGImage;
CGImageRef maskReference = mask.CGImage;

CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(maskReference),
                                         CGImageGetHeight(maskReference),
                                         CGImageGetBitsPerComponent(maskReference),
                                         CGImageGetBitsPerPixel(maskReference),
                                         CGImageGetBytesPerRow(maskReference),
                                         CGImageGetDataProvider(maskReference),
                                         NULL, // Decode is null
                                         YES // Should interpolate
                                         );

CGImageRef maskedReference = CGImageCreateWithMask(imageReference, imageMask);
CGImageRelease(imageMask);

UIImage *maskedImage = [UIImage imageWithCGImage:maskedReference];
CGImageRelease(maskedReference);

return maskedImage;

}

- (IBAction)mask:(id)sender {

    self.imageview.image = [self maskImage:img withMask:[UIImage imageNamed:@"18.jpg"]];
    [sender addTarget:self
               action:@selector(maskButtonClicked:)
     forControlEvents:UIControlEventTouchUpInside];
}
Binarian
  • 12,296
  • 8
  • 53
  • 84
anjani
  • 165
  • 2
  • 12

1 Answers1

1

You are losing orientation data when converting to and from a CGImageRef.

Instead of imageWithCGImage:, use this:

[UIImage imageWithCGImage:maskedReference scale:image.scale orientation:image.imageOrientation];

edit

The mask is also ignoring the image orientation, so the simplest approach is probably just to normalize the image orientation before doing anything to it. See this answer for more details.

After you get the image but before you begin to mask it, fix its orientation with this:

- (UIImage *)normalizedImage:(UIImage *)inputImage 
{
    if (inputImage.imageOrientation == UIImageOrientationUp) return inputImage; 

    UIGraphicsBeginImageContextWithOptions(inputImage.size, NO, inputImage.scale);
    [inputImage drawInRect:(CGRect){0, 0, inputImage.size}];
    UIImage *normalizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return normalizedImage;
}
Community
  • 1
  • 1
Dima
  • 23,484
  • 6
  • 56
  • 83