2013-07-18 59 views
15

我想創建一個像Instagram一樣的相機,用戶可以看到一個盒子並且圖像會裁剪到該盒子。出於某種原因,相機不會一直走到屏幕底部,並在接近尾聲時切斷。我也想知道如何才能將該圖像裁剪成320x320正好在該廣場內?iOS自定義UIImagePickerController相機裁剪到廣場

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

我在iPhone 5上使用IOS7的經驗並不好。具體來說,我可以看到覆蓋圖,但我無法使用原生縮放控件。最後,當我拍攝照片並出現「重拍」和「使用照片」按鈕時,我無法點擊任一按鈕。因人而異 –

相關問題