关于这个主题的帖子太多了,所有这些帖子都有相同的确切答案,
使用:CGImageCreateWithImageInRect
但它们都没有完全解决尝试裁剪的内容定位错误的问题。
然而,只有一条线索(深埋在内心深处)有一个其他人都忽略的小细节......如何在“宽高比”模式下将 UIImageView 裁剪为新的 UIImage?
输入的 'rect' 参数
CGImageCreateWithImageInRect(image.CGImage,croppedRect)
需要表示(取自)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);
// crop image according to what the image picker view is displaying
CGRect rect = CGRectMake(0, 40, 960.0f, 960.0f); // note: 960 x 1280 is what natively comes from capturing and image
nImage = [BGViewModifiers cropImage:oImage inRect:rect];
// scale image down for display and creating kombie
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);
}
//ref: http://stackoverflow.com/a/25293588/2298002
+ (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;
}