有关此主题的帖子非常多,它们都有完全相同的答案,即使用:CGImageCreateWithImageInRect,但是它们都没有完全解决试图裁剪的位置错误的问题。
然而,只有一个线程(深深地埋在内部),有一个细节是其他人都错过了...
如何在“适应”模式下将UIImageView裁剪为新的UIImage?
传递给CGImageCreateWithImageInRect(image.CGImage,croppedRect)的'rect'参数需要表示(取自)UIImage,而不是UIImageView。
这应该解决坐标系上位置不正确的问题。
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo: (NSDictionary *)info
{
oImage = [info valueForKey:UIImagePickerControllerOriginalImage];
NSLog(@"Original Image size width: %f x height: %f", oImage.size.width, oImage.size.height);
CGRect rect = CGRectMake(0, 40, 960.0f, 960.0f);
nImage = [BGViewModifiers cropImage:oImage inRect:rect];
CGSize size = CGSizeMake(320.0f, 320.0f);
nImage = [BGViewModifiers imageFromImage:nImage scaledToSize:size];
NSLog(@"New Image size width: %f x height: %f", [nImage size].width, [nImage size].height);
}
+ (UIImage *)cropImage:(UIImage*)image inRect:(CGRect)rect
{
double (^rad)(double) = ^(double deg) {
return deg / 180.0 * M_PI;
};
CGAffineTransform rectTransform;
switch (image.imageOrientation) {
case UIImageOrientationLeft:
rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(90)), 0, -image.size.height);
break;
case UIImageOrientationRight:
rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(-90)), -image.size.width, 0);
break;
case UIImageOrientationDown:
rectTransform = CGAffineTransformTranslate(CGAffineTransformMakeRotation(rad(-180)), -image.size.width, -image.size.height);
break;
default:
rectTransform = CGAffineTransformIdentity;
};
rectTransform = CGAffineTransformScale(rectTransform, image.scale, image.scale);
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], CGRectApplyAffineTransform(rect, rectTransform));
UIImage *result = [UIImage imageWithCGImage:imageRef scale:image.scale orientation:image.imageOrientation];
CGImageRelease(imageRef);
return result;
}
+ (UIImage*)imageFromImage:(UIImage*)image scaledToSize:(CGSize)newSize
{
UIGraphicsBeginImageContext( newSize );
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}