ios - 使用像 instagram 这样的相机自动裁剪

标签 ios crop image

我想从 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的中心正方形。为此,您可以按如下方式计算 xyside:

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/

相关文章:

ios - 在后台模式下运行网络连接

android - 图像未裁剪

ruby-on-rails - 使用 Rails 和 Paperclip 裁剪时如何获得图像的顶部区域?

html - 如何使用 CSS Flexbox 将流体图像和标题居中?

ios - 如何缩小 UIImage 并同时使其变得清晰/清晰而不是模糊?

iphone - iOS 应用未能及时启动 0x000000008badf00d - applicationDidBecomeActive 延迟

ios - 应用程序不响应 iOS 7 中的报亭通知(适用于 iOS 6 及更早版本)

html - 裁剪然后拉伸(stretch)背景图像以适合某个区域

iPhone - 如何为图像着色?

ios - 当其他文本字段 ios 出现弹出窗口时如何关闭已经打开的键盘