在scrollView中的ImageView中裁剪放大的图像

我已经从我的身边做了很多努力。 最后我需要帮助。 谢谢

目标:1)我如何适应ScrollView里面的imageView

2)我如何裁剪内部scrollView缩放图像。

我有一个imageView里面的滚动视图。 我想缩放后显示滚动视图边界内的裁剪图像。 我已经裁剪了图像,但它不完全一样,我想要的。

在这里,我设置backgroundColor黑色到我的scrollView。 而当我把imageView放在里面时,它不适合。 在这里输入图像说明

滚动视图内缩放图像后

在这里输入图像说明

和作物图像后

在这里输入图像说明

我的代码在这里:

- (void)viewDidLoad { [super viewDidLoad]; CGRect frame1 = CGRectMake(50,50,200,200); CGRect frame2 = CGRectMake(50,50,200,200); imageView1=[[UIImageView alloc]initWithFrame:frame1]; imageView1.image= [UIImage imageNamed:@"back.jpeg"]; imageView1.backgroundColor=[UIColor brownColor]; imageView1.contentMode = UIViewContentModeScaleAspectFit; scroll=[[UIScrollView alloc]initWithFrame:frame2]; scroll.backgroundColor=[UIColor blackColor]; [scroll addSubview:imageView1]; scroll.delegate=self; [self.view addSubview:scroll]; [self setContentSizeForScrollView]; self.imageView1.userInteractionEnabled = YES; } 

设置滚动视图contentSize

 -(void)setContentSizeForScrollView { // scroll.contentSize = CGSizeMake(imageView1.frame.size.width,imageView1.frame.size.height); scroll.contentSize = CGSizeMake(200, 200); scroll.minimumZoomScale = .50; scroll.maximumZoomScale = 1.5; } 

而我的裁剪逻辑是

 -(IBAction)cropButtonClicked { //Calculate the required area from the scrollview CGRect rect = CGRectMake(50, 50, 200,200); UIImage *image = [self imageByCropping:imageView1.image toRect:rect]; imageView1.image=image; imageView1.contentMode = UIViewContentModeScaleAspectFit; } 

而这种方法裁剪图像:

 - (UIImage*)imageByCropping:(UIImage *)myImage toRect:(CGRect)cropToArea{ CGImageRef cropImageRef = CGImageCreateWithImageInRect(myImage.CGImage, cropToArea); UIImage* cropped = [UIImage imageWithCGImage:cropImageRef]; CGImageRelease(cropImageRef); return cropped; } 

我自己的问题答案:经过许多努力,我find了两个问题的答案。

这对我有好处 我在这里分享,可能会帮助别人。 🙂

1)适合图像查看滚动视图。 我使用这个链接

 - (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)在scrollView内部裁剪放大的图像。 我使用这个链接

  UIGraphicsBeginImageContext(CGSizeMake(200, 200)); [scroll.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *fullScreenshot = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); imageView1.contentMode = UIViewContentModeScaleAspectFill; UIImageWriteToSavedPhotosAlbum(fullScreenshot, nil, nil, nil); return fullScreenshot; 

我最近有一个类似的问题,我用相对的想法得到了解(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... 

您可以使用以下命令裁切图像:

 //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; } 

由于您在Aspect Fit中使用ImageView,因此需要计算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); } } 

我希望这个代码可以为你工作,因为它为我工作。

最好,

拉斐尔。