【问题标题】:iOS Custom UIImagePickerController Camera Crop to SquareiOS 自定义 UIImagePickerController 相机裁剪为方形
【发布时间】:2013-07-16 18:34:33
【问题描述】:

我正在尝试创建一个像 Instagram 一样的相机,用户可以在其中看到一个框,并且图像会裁剪到该框。出于某种原因,相机并没有一直走到屏幕底部,而是在接近尾声时切断。我还想知道如何在该正方形内将图像裁剪为 320x320?

【问题讨论】:

    标签: iphone ios image-processing uiimagepickercontroller crop


    【解决方案1】:

    这是最简单的方法(无需重新实现UIImagePickerController)。首先,使用叠加层使相机区域看起来是方形的。以下是 3.5" 屏幕的示例(您需要对其进行更新以适用于 iPhone 5):

    UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
    imagePickerController.sourceType = source;
    
    if (source == UIImagePickerControllerSourceTypeCamera) {
        //Create camera overlay
        CGRect f = imagePickerController.view.bounds;
        f.size.height -= imagePickerController.navigationBar.bounds.size.height;
        CGFloat barHeight = (f.size.height - f.size.width) / 2;
        UIGraphicsBeginImageContext(f.size);
        [[UIColor colorWithWhite:0 alpha:.5] set];
        UIRectFillUsingBlendMode(CGRectMake(0, 0, f.size.width, barHeight), kCGBlendModeNormal);
        UIRectFillUsingBlendMode(CGRectMake(0, f.size.height - barHeight, f.size.width, barHeight), kCGBlendModeNormal);
        UIImage *overlayImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        UIImageView *overlayIV = [[UIImageView alloc] initWithFrame:f];
        overlayIV.image = overlayImage;
        [imagePickerController.cameraOverlayView addSubview:overlayIV];
    }
    
    imagePickerController.delegate = self;
    [self presentViewController:imagePickerController animated:YES completion:nil];
    

    然后,在您从UIImagePickerController 取回图片后,将其裁剪成一个正方形,如下所示:

    //Crop the image to a square
    CGSize imageSize = image.size;
    CGFloat width = imageSize.width;
    CGFloat height = imageSize.height;
    if (width != height) {
        CGFloat newDimension = MIN(width, height);
        CGFloat widthOffset = (width - newDimension) / 2;
        CGFloat heightOffset = (height - newDimension) / 2;
        UIGraphicsBeginImageContextWithOptions(CGSizeMake(newDimension, newDimension), NO, 0.);
        [image drawAtPoint:CGPointMake(-widthOffset, -heightOffset)
                       blendMode:kCGBlendModeCopy
                           alpha:1.];
        image = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    }
    

    你已经完成了。

    【讨论】:

    • 谢谢,效果很好!我想知道是否有任何方法可以让相机打开动画出现在叠加层之上?
    • 不,不幸的是,没有办法使用公开记录的 API 来执行此操作(即不做任何会导致 Apple 拒绝该应用程序的事情)。如果您想正确执行此操作,则需要重新实现UIImagePickerController
    • 我们应该进行哪些更改才能使其在 iphone 5 和以前的 iphone 上都可以使用?
    • 这里我可以知道源是哪种类型的变量以及我们需要在哪个图像选择器委托方法中编写上面的代码
    • 一开始效果很好,但现在我在运行此代码时遇到了内存问题。有人遇到同样的问题吗?
    【解决方案2】:

    @Anders 的答案在 iPhone 5 上对我来说非常接近正确。我进行了以下修改,为 iPhone 5 添加了硬编码的覆盖:

    CGRect f = imagePickerController.view.bounds;
    f.size.height -= imagePickerController.navigationBar.bounds.size.height;
    UIGraphicsBeginImageContext(f.size);
    [[UIColor colorWithWhite:0 alpha:.5] set];
    UIRectFillUsingBlendMode(CGRectMake(0, 0, f.size.width, 124.0), kCGBlendModeNormal);
    UIRectFillUsingBlendMode(CGRectMake(0, 444, f.size.width, 52), kCGBlendModeNormal);
    UIImage *overlayImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    UIImageView *overlayIV = [[UIImageView alloc] initWithFrame:f];
    overlayIV.image = overlayImage;
    overlayIV.alpha = 0.7f;
    [imagePickerController setCameraOverlayView:overlayIV];`
    

    我希望这对某人有所帮助。

    【讨论】:

    • 我在 iPhone 5 上的 IOS7 上的体验不是很好。具体来说,我可以看到覆盖,但我无法使用本机缩放控件。最后,当我拍摄照片并出现“重拍”和“使用照片”按钮时,我无法单击任何一个按钮。 YMMV
    猜你喜欢
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 2017-05-18
    • 2015-11-05
    • 2012-03-10
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    相关资源
    最近更新 更多