Search code examples
iosobjective-cuiscrollviewuiimageviewuigraphicscontext

Convert UIScrollViewPoint to UIImage + ZOOM + ROTATE


I need to crop UIImage which is loaded in UIScrollview with some rect of Another UIView which is also in UIScrollView

Following is View Hierarchy

 --> View
     -->  UIScrollView
        --> viewBase (UIView)
             --> UIImageView -> (Zoomed & rotated )
             --> UIView (Target View)(Movable User can move anywhere in scrollview  to crop rect)

My Image is Rotated & Zoomed I need to get exact part of image in TargetView

I am drawing UIImage with rotation on context following is code

CGFloat angleCroppedImageRetreacted = atan2f(self.imgVPhoto.transform.b, self.imgVPhoto.transform.a);
angleCroppedImageRetreacted = angleCroppedImageRetreacted * (180 / M_PI);

UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.imgVPhoto.image.size.width, self.imgVPhoto.image.size.height)];
rotatedViewBox.transform = CGAffineTransformMakeRotation(-angleCroppedImageRetreacted);
CGSize rotatedSize = rotatedViewBox.frame.size;

UIGraphicsBeginImageContext(rotatedSize);
CGContextRef bitmap = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(bitmap, rotatedSize.width / 2.0f, rotatedSize.height / 2.0f);
CGContextRotateCTM(bitmap, -angleCroppedImageRetreacted);
CGContextScaleCTM(bitmap, 1.0f, -1.0f);



CGContextDrawImage(bitmap, CGRectMake(-self.imgVPhoto.image.size.width / 2.0f,
                                      -self.imgVPhoto.image.size.height / 2.0f,
                                      self.imgVPhoto.image.size.width,
                                      self.imgVPhoto.image.size.height),
                   self.imgVPhoto.image.CGImage);
UIImage *resultImage = UIGraphicsGetImageFromCurrentImageContext();




UIGraphicsEndImageContext();

And it works fine . I am getting Rotated UIImage same as i can see in Simulator

For converting Point of Target View to UIImage I use following code which is NOT WORKING

 CGPoint imageViewPoint = [self.viewBase convertPoint:self.targetImageview.center toView:self.imgVPhoto];

float percentX = imageViewPoint.x / self.imgVPhoto.frame.size.width;
float percentY = imageViewPoint.y / self.imgVPhoto.frame.size.height;

CGPoint imagePoint = CGPointMake(resultImage.size.width * percentX, resultImage.size.height * percentY);

rect.origin = imagePoint;

//rect.origin.x *= (self.imgVPhoto.image.size.width / self.imgVPhoto.frame.size.width);
//rect.origin.y *= (self.imgVPhoto.image.size.height / self.imgVPhoto.frame.size.height);


imageRef = CGImageCreateWithImageInRect([resultImage CGImage], rect);
img = [UIImage imageWithCGImage:imageRef scale:viewImage.scale orientation:viewImage.imageOrientation];

I think issue is we can't use Rect after Transform Apply

Please Help me to crop UIImage which is zoomed and rotated from rect on same Hierarchy

If you need more info pls ask


Solution

  • I am answering my own question .

    Thanks to Matic for giving a idea

    I changed a logic

    I have achieved same functionality what i looking for

    CGPoint locationInImageView =  [self.viewBase convertPoint:self.targetImageview.center toView:self.view]; // received from touch
    locationInImageView =  [self.view convertPoint:locationInImageView toView:self.imgVPhoto];
    
    // I GOT LOCATION IN UIIMAGEVIEW OF TOUCH POINT
    
    UIGraphicsBeginImageContextWithOptions(self.view.frame.size, NO, 0);
    
    [self.imgVPhoto.layer renderInContext:UIGraphicsGetCurrentContext()];
    
    UIImage *img1 = UIGraphicsGetImageFromCurrentImageContext();
    
    UIGraphicsEndImageContext();
    
    // I GOT UIIMAGE FROM  CURRENT CONTEXT 
    
    CGFloat width = self.targetImageview.frame.size.width * self.zoomScale ;
    CGFloat height = self.targetImageview.frame.size.height * self.zoomScale ;
    
     //2 IS SCALE FACTOR 
    
    CGFloat xPos = (locationInImageView.x  * 2)  - width / 2;
    CGFloat yPos = (locationInImageView.y * 2) - height / 2;
    
    CGRect rect1 = CGRectMake(xPos, yPos, width, height);
    
    CGImageRef imageRef = CGImageCreateWithImageInRect([img1 CGImage], rect1);
    
    
    // YAHHH YOU HAVE EXACT IMAGE 
    UIImage *img = [UIImage imageWithCGImage:imageRef scale:img1.scale orientation:img1.imageOrientation];