我想从 Instagram 之类的应用程序中拍摄一张方形照片。但是我不知道该怎么做。我知道 y,图像仍然需要裁剪,相机一直在捕捉整个图像,只是我在 View 中“实时”裁剪它。抓图的时候还是整张图,还是要裁剪。只有用户看不到它的发生,因为它都是在后台完成的。使用设备相机捕获图像后,将其放入 UIImage 的实例,然后编写一个方法,该方法将获取该 UIIMage 并使用 CGRefImageContext 调整其大小,然后如果不再需要原始实例,则覆盖原始 UIImage 实例。我不知道该怎么做。是否有网站显示如何执行此操作?还是有更简单的方法来做到这一点。
最佳答案
首先,你需要用相机拍照,所以在你想拍照的地方加上这段代码。
UIImagePickerController *pickerController = [[UIImagePickerController alloc] init];
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
pickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
pickerController.delegate = self;
[self presentViewController:pickerController
animated:YES
completion:nil];
}
然后,您需要实现委托(delegate)方法。您的类必须符合 UIImagePickerControllerDelegate
,已记录 here .在 imagePickerController 中:
didFinishPickingMediaWithInfo:
方法,你可以在 UIImage
中拍摄照片:
UIImage *imageTaked = info[UIImagePickerControllerOriginalImage];
如果你愿意,此时你可以获取所拍照片的元数据
info [UIImagePickerControllerMediaMetadata];
最后,当您在 UIImage 中拥有您的照片时,您可以按如下方式裁剪图像:
CGFloat x, y, side; //We will see how to calculate those values later.
UIImage* imageCropped;
CGRect cropRect = CGRectMake(x,y,side,side);
CGImageRef imageRef = CGImageCreateWithImageInRect([imageTaked CGImage], cropRect);
imageCropped = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
所以,这里重要的是如何计算cropRect
来切割UIImage的中心正方形。为此,您可以按如下方式计算 x
、y
和 side
:
side = MIN(imageTaked.size.width, imageTaked.size.height
x = imageTaked.size.width / 2 - side / 2;
y = imageTaked.size.height / 2 - side / 2;
好的,所以,总结一下 imagePickerController 中的所有代码:
didFinishPickingMediaWithInfo:
方法导致:
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *imageTaked = info[UIImagePickerControllerOriginalImage];
//You can take the metadata here => info [UIImagePickerControllerMediaMetadata];
UIImage* imageCropped;
CGFloat side = MIN(imageTaked.size.width, imageTaked.size.height);
CGFloat x = imageTaked.size.width / 2 - side / 2;
CGFloat y = imageTaked.size.height / 2 - side / 2;
CGRect cropRect = CGRectMake(x,y,side,side);
CGImageRef imageRef = CGImageCreateWithImageInRect([imageTaked CGImage], cropRect);
imageCropped = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
}
编辑
如果您想将照片发送到另一台设备,照片可能会旋转。那是因为 Apple 对图像使用 exif 元数据,而其他平台则没有。要解决此问题,只需使用此方法设置适当的元数据信息即可:
-(UIImage*)getImageWithCorrectFiltersFromOriginalImage:(UIImage *)originalImage
{
UIImageOrientation orientation = UIImageOrientationUp;
NSNumber* orientationValue = [originalImage valueForProperty:@"ALAssetPropertyOrientation"];
if (orientationValue) {
orientation = [orientationValue intValue];
}
ALAssetRepresentation *assetRep = [originalImage defaultRepresentation];
CGImageRef imageRef = [assetRep fullResolutionImage];
return [UIImage imageWithCGImage:imageRef scale:[assetRep scale] orientation:orientation];
}
希望对您有所帮助!如果在复制粘贴过程中出现问题,请告诉我,现在是凌晨 2:00,我现在是一个僵尸人!
关于ios - 使用像 instagram 这样的相机自动裁剪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18029090/