CGImageCreateWithImageInRect不正确裁剪

我有一个时间使用CGImageCreateWithImageInRect裁剪照片。 我的应用程序有用户移动/放大图像,直到它填充316 x 316视图,然后我希望它裁剪框外的任何区域,并将图像保存为UIImage。 我通过获取x和y图像视图原点的绝对值来确定作物的原点,因为这将我带回到包含图像视图的视图/框的0,0。 以下是代码:

CGRect croppedRect = CGRectMake(fabs(widthDistanceToOrigin), fabs(HeightDistanceToOrigin), 316, 316); CGImageRef croppedImageRef = CGImageCreateWithImageInRect(image.CGImage, croppedRect); UIImage *croppedImage = [UIImage imageWithCGImage: croppedImageRef scale: 1 / (imageScale) orientation: image.imageOrientation]; CGImageRelease(croppedImageRef); 

这让我疯狂,我不能把它收割到我想要的地方。 我已经把它正确地缩放了,但是问题似乎与作物矩形的x和y原点有关,与它应该采取的区域相差太远(有时我会得到奇怪的结果)。

而且,对于手机相机拍摄的影像来说,我必须将我的作物中的所有东西都乘以2,因为它是正确的尺寸。 很奇怪。

所以我想知道,有没有人知道如何解决这个问题,或者有没有人有更好的裁剪方式(请记住,我需要在我的照片中裁剪一个区域)。 谢谢!

有很多关于这个主题的post,他们都有相同的确切答案,利用: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: %fx 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: %fx 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; } 

我想根据我自己的经验提供更多的信息/答案。

UIImage (和CGImageCreateWithImageInRect:透视图中, (0, 0)在左下angular。 在确定裁切平方时,可以简单地根据标准的纵向方向计算平方,然后使用@ greenhouse的答案中的方法(为了清晰起见,在这里再次发布,并更改为使用CGFloat来修复投射错误。

 - (UIImage *)cropImage:(UIImage*)image toRect:(CGRect)rect { CGFloat (^rad)(CGFloat) = ^CGFloat(CGFloat deg) { return deg / 180.0f * (CGFloat) M_PI; }; // determine the orientation of the image and apply a transformation to the crop rectangle to shift it to the correct position 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; }; // adjust the transformation scale based on the image scale rectTransform = CGAffineTransformScale(rectTransform, image.scale, image.scale); // apply the transformation to the rect to create a new, shifted rect CGRect transformedCropSquare = CGRectApplyAffineTransform(rect, rectTransform); // use the rect to crop the image CGImageRef imageRef = CGImageCreateWithImageInRect(image.CGImage, transformedCropSquare); // create a new UIImage and set the scale and orientation appropriately UIImage *result = [UIImage imageWithCGImage:imageRef scale:image.scale orientation:image.imageOrientation]; // memory cleanup CGImageRelease(imageRef); return result; } 

这段代码移动裁剪的方块,使其处于正确的相对位置。

我发现了这个问题。 在缩放图像之前,我正试图抓取裁剪区域。 现在必须弄清楚如何在我做“CGImageCreateWithImageInRect”之前减less图像。