crop a zoomed image in ImageView inside scrollView

后端 未结 2 1910
灰色年华
灰色年华 2021-02-09 05:47

I already do Lot of efforts from my Side. finally I need help. thanks

Goal : 1) How I fit imageView inside ScrollView

2) How I crop a zoomed Image in inside scro

相关标签:
2条回答
  • 2021-02-09 05:48

    I had a similar problem recently, I got the solution using the relative idea ( Xa,b = Xa,c - Xb,c )

    -(IBAction)crop:(id)sender{
    
            // F = frame
            // i = image
            // iv = imageview
            // sv = self.view
            // of = offset
    
            //Frame Image in imageView coordinates
            CGRect Fi_iv = [self frameForImage:self.image inImageViewAspectFit:self.imageView];
    
            //Frame ImageView in self.view coordinates
            CGRect Fiv_sv = self.imageView.frame;
    
            //Frame Image in self.view coordinates
            CGRect Fi_sv = CGRectMake(Fi_iv.origin.x + Fiv_sv.origin.x
                                      ,Fi_iv.origin.y + Fiv_sv.origin.y,
                                      Fi_iv.size.width, Fi_iv.size.height);
            //ScrollView offset
            CGPoint offset = self.scrollView.contentOffset;
    
            //Frame Image in offset coordinates
            CGRect Fi_of = CGRectMake(Fi_sv.origin.x - offset.x,
                                            Fi_sv.origin.y - offset.y,
                                            Fi_sv.size.width,
                                            Fi_sv.size.height);
    
            CGFloat scale = self.imageView.image.size.width/Fi_of.size.width;
    
            //the crop frame in image offset coordinates
            CGRect Fcrop_iof = CGRectMake((self.cropView.frame.origin.x - Fi_of.origin.x)*scale,
                                          (self.cropView.frame.origin.y - Fi_of.origin.y)*scale,
                                          self.cropView.frame.size.width*scale,
                                          self.cropView.frame.size.height*scale);
    
            UIImage *image = [self image:self.imageView.image cropRect:Fcrop_iof];
            // Use this crop image...
    

    You can crop the image using:

    //Use this code to crop when you have the right frame
    -(UIImage*)image:(UIImage *)image cropRect:(CGRect)frame
    {
        // Create a new UIImage
        CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage, frame);
        UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
        CGImageRelease(imageRef);
    
        return croppedImage;
    }
    

    Since you are using the ImageView in Aspect Fit, you need to calculate the image frame inside the imageView

    -(CGRect)frameForImage:(UIImage*)image inImageViewAspectFit:(UIImageView*)imageView
    {
        float imageRatio = image.size.width / image.size.height;
    
        float viewRatio = imageView.frame.size.width / imageView.frame.size.height;
    
        if(imageRatio < viewRatio)
        {
            float scale = imageView.frame.size.height / image.size.height;
    
            float width = scale * image.size.width;
    
            float topLeftX = (imageView.frame.size.width - width) * 0.5;
    
            return CGRectMake(topLeftX, 0, width, imageView.frame.size.height);
        }
        else
        {
            float scale = imageView.frame.size.width / image.size.width;
    
            float height = scale * image.size.height;
    
            float topLeftY = (imageView.frame.size.height - height) * 0.5;
    
            return CGRectMake(0, topLeftY, imageView.frame.size.width, height);
        }
    }
    

    I hope this code can work for you as it worked for me.

    Best,

    Rafael.

    0 讨论(0)
  • 2021-02-09 05:54

    Answer of my own Question : After many efforts i found the answer of both of my questions.

    and it work good for me. I share here, may be it help someone. :)

    1) Fit image View inside Scroll View. I use this link

    - (void)centerScrollViewContents {
    
    CGSize boundsSize = scroll.bounds.size;
    CGRect contentsFrame = self.imageView1.frame;
    
    if (contentsFrame.size.width < boundsSize.width) {
    contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2.0f;
    } 
    else {
    contentsFrame.origin.x = 0.0f;
    }
    
    if (contentsFrame.size.height < boundsSize.height) {
        contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2.0f;
    } 
    else {
    contentsFrame.origin.y = 0.0f;
    }
    
    self.imageView1.frame = contentsFrame;
    }
    

    2) Crop a zoomed Image in inside scrollView. I use this link

        UIGraphicsBeginImageContext(CGSizeMake(200, 200));
    
        [scroll.layer renderInContext:UIGraphicsGetCurrentContext()];
    
        UIImage *fullScreenshot = UIGraphicsGetImageFromCurrentImageContext();
    
        UIGraphicsEndImageContext();
    
        imageView1.contentMode = UIViewContentModeScaleAspectFill;
    
        UIImageWriteToSavedPhotosAlbum(fullScreenshot, nil, nil, nil);
    
        return fullScreenshot;
    
    0 讨论(0)
提交回复
热议问题