2013-07-18 48 views
15

Tôi đang cố gắng tạo một máy ảnh như Instagram nơi người dùng có thể nhìn thấy một hộp và hình ảnh sẽ cắt thành hộp đó. Đối với một số lý do máy ảnh không đi tất cả các cách để dưới cùng của màn hình và cắt đứt gần cuối. Tôi cũng tự hỏi làm thế nào tôi sẽ đi về cắt hình ảnh để được 320x320 chính xác bên trong hình vuông đó?Máy ảnh UIImagePickerController tùy chỉnh iOS Cắt thành hình vuông

enter image description here

Trả lời

38

Dưới đây là cách dễ nhất để làm điều đó (không reimplementing UIImagePickerController). Đầu tiên, sử dụng lớp phủ để làm cho trường máy ảnh trông vuông. Dưới đây là một ví dụ cho 3,5" màn hình (bạn sẽ cần phải cập nhật nó để làm việc cho 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]; 

Sau đó, sau khi bạn nhận được một bức tranh trở lại từ UIImagePickerController, cắt nó thành một hình vuông với một cái gì đó như thế này :.

//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(); 
} 

Và bạn đã hoàn tất

+0

Cảm ơn tác phẩm tuyệt vời! Tôi đã tự hỏi nếu có anyway tôi có thể làm cho hình ảnh động mở camera đi trên đầu trang của lớp phủ? – NSDavidObject

+0

Không, thật không may là không có cách nào để thực hiện việc này bằng cách sử dụng API được ghi tài liệu công khai (nghĩa là không làm điều gì đó có thể khiến Apple từ chối Ứng dụng). Nếu bạn muốn làm điều này bạn đúng, bạn sẽ cần phải reimplement 'UIImagePickerController'. – Ander

+1

Chúng ta nên thay đổi điều gì để nó hoạt động trên cả iPhone 5 và các điện thoại trước? –

4

@Anders câu trả lời là rất chặt chẽ để điều chỉnh đối với tôi trên iPhone 5. tôi đã thay đổi sau đây để thêm lớp phủ hardcoded cho 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];` 

Tôi hy vọng điều này sẽ giúp ai đó.

+6

Trải nghiệm của tôi về điều này trên IOS7 trên iPhone 5 không tuyệt vời. cụ thể, tôi có thể thấy lớp phủ, nhưng tôi không thể sử dụng các điều khiển thu phóng gốc. cuối cùng, khi tôi chụp ảnh và các nút "Retake" và "Use Photo", xuất hiện, tôi không thể nhấp vào một trong hai nút. YMMV –

Các vấn đề liên quan