如何正确裁剪UIImage与UIImagePickerController?

这是我的应用程序的相机覆盖,

在这里输入图像说明

黄色正方形表示用户只有该部分(相机内)的照片才会被保存。 这就像庄稼。

当我保存了捕捉图像时,它将保存缩放的照片[放大照片],

在这里输入图像说明

我发现,当我拍了一张照片时,它的尺寸是{2448, 3264}

我正在像这样裁剪图像,

 - (UIImage *)imageByCroppingImage:(UIImage *)image toSize:(CGSize)size { double x = (image.size.width - size.width) / 2.0; double y = (image.size.height - size.height) / 2.0; CGRect cropRect = CGRectMake(x, y, size.height, size.width); CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropRect); UIImage *cropped = [UIImage imageWithCGImage:imageRef]; CGImageRelease(imageRef); return cropped; } - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage]; if (image) { UIImage *newImage = [self imageByCroppingImage:image toSize:CGSizeMake(300.f, 300.f)]; UIImageWriteToSavedPhotosAlbum(newImage, nil, nil, nil); } } 

笔记,

  • 在裁剪之前,方向是固定的。 使用这个, http://pastebin.com/WYUkDLS0

  • 相机上的黄色方块也是相同的尺寸,宽度= 300,高度= 300。

  • 如果我为UIImagePickerController设置前置摄像头,那么它会给我裁剪图像的完美输出。 是的,这真的很奇怪!

  • 我已经尝试了从这里的一切, 裁剪UIImage 。 即使https://github.com/Nyx0uf/NYXImagesKit也无济于事。

任何想法/build议?


更新:

从这个问题, 试图裁剪我的UIImage 1:1纵横比(方形),但它不断扩大图像造成它模糊。 为什么?

我跟着@DrummerB这样的回答,

  CGFloat originalWidth = image.size.width * image.scale; CGFloat originalHeight = image.size.height * image.scale; float smallestDimension = fminf(originalWidth, originalHeight); CGRect square = CGRectMake(0, 0, smallestDimension, smallestDimension); CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], square); UIImage *squareImage = [UIImage imageWithCGImage:imageRef scale:image.scale orientation:image.imageOrientation]; UIImageWriteToSavedPhotosAlbum(squareImage, nil, nil, nil); CGImageRelease(imageRef); 

这是我抓到的,

在这里输入图像说明

这导致我下面,

在这里输入图像说明

现在我正在看广场的照片,但是在输出中注意到,我仍然在黄色广场外面看到照片。 我想要的是得到居住在黄色方块的照片。 捕获的图像仍然是大小,{W = 2448,H = 3264}。 请注意,表示图像的外部不应包含在该部分中的红色圆圈不在黄色方块内。

这有什么不对?

最后,我从这里得到了我的工作解决scheme。 我不确定在这里复制“网站内容”会产生什么错误(?),尽pipe我并没有在这里粘贴这些代码。

它看起来像你在实施中收到的图像是返回300×300像素的图像作物。 你在屏幕上的黄色方块是300乘300点。 点与像素不一样。 所以,如果你的照片3264像素宽,然后裁剪到300像素将返回约十分之一的原始大小的图像。