Ios 使用类似照相机的instagram自动裁剪

Ios 使用类似照相机的instagram自动裁剪,ios,crop,image,Ios,Crop,Image,我想从instagram这样的应用程序中拍摄一张方形照片。但是我不知道怎么做。我知道y,图像仍然需要裁剪,相机一直在捕捉整个图像,只是我在视图中“实时”裁剪它。捕获图像时,它仍然是整个图像,并且仍然必须进行裁剪。只有用户没有看到它的发生,因为这一切都是在后台完成的。一旦你用你的相机捕捉到图像,把它 到UIImage的实例,然后编写一个方法,该方法将获取该UIImage并使用CGRefImageContext调整其大小,如果不再需要原始UIImage实例,则覆盖原始UIImage实例。我不知道该

我想从instagram这样的应用程序中拍摄一张方形照片。但是我不知道怎么做。我知道y,图像仍然需要裁剪,相机一直在捕捉整个图像,只是我在视图中“实时”裁剪它。捕获图像时,它仍然是整个图像,并且仍然必须进行裁剪。只有用户没有看到它的发生,因为这一切都是在后台完成的。一旦你用你的相机捕捉到图像,把它 到UIImage的实例,然后编写一个方法,该方法将获取该UIImage并使用CGRefImageContext调整其大小,如果不再需要原始UIImage实例,则覆盖原始UIImage实例。我不知道该怎么做。是否有一个网站展示了如何做到这一点?还是有更简单的方法

首先,你需要用相机拍照,所以在你想拍照的地方添加此代码

UIImagePickerController *pickerController = [[UIImagePickerController alloc] init];

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
    pickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
    pickerController.delegate = self;
    [self presentViewController:pickerController 
                       animated:YES
                     completion:nil];
}
然后,您需要实现委托方法。您的类必须符合
UIImagePickerController-Delegate
,并有文档记录。在
图像选择器控制器中:
如果使用info:
方法完成PickingMediaWithInfo:操作,您可以使用以下工具在
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);
side = MIN(imageTaked.size.width, imageTaked.size.height
x = imageTaked.size.width / 2 - side / 2;
y = imageTaked.size.height / 2 - side / 2;
因此,这里重要的是如何计算
cropRect
来切割UIImage的中心正方形。为此,您可以按如下方式计算
x
y
side

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);
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);
}
编辑

如果要将照片发送到其他设备,可能会旋转照片。这是因为苹果对图像使用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点,我现在是个僵尸

您好,谢谢您的快速回复!只有几个问题。我想把它自动裁剪成像instagram一样的612x612。我应该在哪里更改代码?而且当我按下应用程序中的摄像头按钮时,它会启动摄像头,但我只想显示像instagram应用程序一样裁剪时剩余的区域。对不起,解释得不好,我理解。如果要绘制正方形,必须在设置
源类型之后,设置
pickerController
cameraOverlayView
属性。要在每侧裁剪612px的正方形,应将
值硬编码为612,但不建议这样做,因为您不知道UIImage的大小,即使您知道,它可能会随着iPhone摄像头分辨率的改变而改变。对不起,我太初学了。我该如何设置cameraOverlayView并使它看起来像instagram一样?即使我将其更改为612,它也确实发生了变化。您需要创建一个正方形的视图(如果您想在另一个线程中打开它,这是另一个问题),在创建该视图之后,以及在
pickerController.sourceType=UIImagePickerControllerSourceTypeCamera之后行,您应该使
pickerController.cameraOverlayView=yourNewView好的,我很困惑,我想忘记cameraOverlayView,只需将焦点裁剪到一个320x320的正方形,就像allowsediting一样。我将代码更改为CGFloat x=imageTaked.size.width/320-side/320;CGFloat y=图像拍摄的尺寸高度/320-侧面/320;