我正在创建一个具有图像裁剪功能的iPhone应用程序。在这里,我从UIImagePickerController获取照片并将其传递给裁剪。它有一个滚动视图,所选图像将作为子视图添加到滚动视图中。我正在使用UIButton来选择裁剪区域。用户可以在图像视图上移动按钮并将其放在任何位置,当单击“CROP”按钮时,应该从图像视图中裁剪类似于按钮框架大小的区域。
我使用了以下代码,但它没有返回实际图像。
CGRect clippedRect = CGRectMake(self.scrollView.frame.origin.x+90, self.scrollView.frame.origin.y, self.scrollView.frame.size.width-180, self.scrollView.frame.size.height-220);
CGImageRef imageRef = CGImageCreateWithImageInRect([self.myPhoto CGImage], clippedRect);
UIImage *newImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
self.imageView.image = newImage;
也用过
- (UIImage *)cropImage:(UIImage *)oldImage {
CGSize imageSize = self.cropFrame.frame.size;
UIGraphicsBeginImageContextWithOptions( CGSizeMake( imageSize.width, imageSize.height), NO, 0.);
[oldImage drawAtPoint:CGPointMake( xPosition, yPosition)
blendMode:kCGBlendModeCopy
alpha:1.];
UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return croppedImage;
}
但结果图像不是按钮框架的精确图像。我从另一个区域获取图像。
更新了代码
- (void)loadPhoto{
CGFloat w = self.myPhoto.size.width;
CGFloat h = self.myPhoto.size.height;
CGRect imageViewFrame = CGRectMake(0.0f, 0.0f, roundf(w / 2.0f), roundf(h / 2.0f));
self.scrollView.contentSize = imageViewFrame.size;
UIImageView *iv = [[UIImageView alloc] initWithFrame:imageViewFrame];
iv.contentMode = UIViewContentModeScaleAspectFit;
iv.image = self.myPhoto;
[self.view addSubview:iv];
self.imageView = iv;
[iv release];
}
CGRect crop;//= CGRectMake(10, 10, 360, 360);
crop.origin.x = self.cropFrame.frame.origin.x;
crop.origin.y = self.cropFrame.frame.origin.y;
crop.size.width = roundf(self.cropFrame.frame.size.width * 2.0f); //self.cropFrame.frame.size.width * 2;
crop.size.height = roundf(self.cropFrame.frame.size.height * 2.0f); //self.cropFrame.frame.size.height * 2;
NSLog(@"Rect: %@", NSStringFromCGRect(crop));
self.imageView.image = [self croppedImage:crop];
- (UIImage *)croppedImage:(CGRect)bounds {
CGImageRef imageRef = CGImageCreateWithImageInRect([self.imageView.image CGImage], bounds);
UIImage *croppedImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:self.myPhoto.imageOrientation];
CGImageRelease(imageRef);
return croppedImage;
}
请帮助找到解决方案。
答案 0 :(得分:0)
iOS具有裁剪图像的默认功能。请尝试使用此代码。
picker.allowsEditing = YES;
并检查此控制器是否有裁剪..这正是您正在寻找的那个我认为https://github.com/barrettj/BJImageCropper。希望这可以帮助您..
答案 1 :(得分:0)
由于您使用的滚动视图允许滚动图像,因此您需要将裁剪矩形调整为scrollView的位置:
float zoomScale = self.scrollView.zoomScale;
int cropX = (self.scrollView.contentOffset.x-imageView.frame.origin.x)/zoomScale;
int cropY = (self.scrollView.contentOffset.y-imageView.frame.origin.y)/zoomScale;
答案 2 :(得分:0)
您可以使用我制作的裁剪工具。它本质上为您提供了一个界面,允许用户选择裁剪区域。我认为这与你正在寻找的一致。
答案 3 :(得分:0)
相信你已经解决了这个问题。尝试裁剪功能时我也有这个
将image.size设置为imageView.size& scrollView.contentSize。下面的代码将给出矩形裁剪
cropRect.origin = scrollView.contentOffset;
cropRect.size = scrollView.bounds.size;
cropRect.origin.x /= scrollView.zoomScale;
cropRect.origin.y /= scrollView.zoomScale;
cropRect.size.width /= scrollView.zoomScale;
cropRect.size.height /= scrollView.zoomScale;
如果计划首先在可见的rect上显示完整的图像。设置imageView.size& scrollView.contentSize到可见视图大小将给出一些其他区域的裁剪图像。而是尝试通过
找到缩放比例CGFloat dxWidth = viewCrop.frame.size.width / imageView.image.size.width;
CGFloat dxHeight = viewCrop.frame.size.height / imageView.image.size.height;
CGFloat zoomScale = fmaxf(dWidth, dHeight)
并应用(如果通过在addSubView之后添加subView)
scrollView.minimumZoomScale = zoomScale; // to disable further zoom-out
[scrollView setZoomScale: zoomScale];