2013-07-18 5 views
15

Я пытаюсь создать такую ​​камеру, как Instagram, где пользователь может видеть окно, и изображение будет обрезано в этом поле. По какой-то причине камера не доходит до нижней части экрана и отключается ближе к концу. Мне также интересно, как я могу обрезать изображение размером 320x320 именно внутри этой площади?iOS Custom UIImagePickerController Camera Crop to Square

enter image description here

ответ

38

Вот самый простой способ сделать это (без реализовав 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(); 
} 

И вы сделали

+0

Спасибо, что работает отлично! Мне было интересно, если в любом случае я могу сделать анимацию открытия камеры сверху поверх наложения? – NSDavidObject

+0

Нет, к сожалению, это невозможно сделать с помощью публично документированных API (т. Е. Не делать что-то, что может заставить Apple отклонить приложение). Если вы хотите сделать это правильно, вам нужно будет переопределить 'UIImagePickerController'. – Ander

+1

Что мы должны изменить, чтобы он работал как на iphone 5, так и на предыдущих iPhone? –

4

@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];` 

Надеюсь, это поможет кому-то.

+6

Мой опыт работы с этим на IOS7 на iPhone 5 был невелик. в частности, я мог видеть оверлей, но я не мог использовать собственные средства масштабирования. наконец, когда я взял фотографию и кнопки «Повторить» и «Использовать фотографию», появилось, я не смог нажать любую кнопку. YMMV –