DEVELOPER.XIAOYAOLI 技術筆記 簡單的利用UIImagePickerController調用iPhone攝像頭獲取照片的方法,同時介紹了怎麼添加overlay,用於自定義預覽界面 UIImagePickerController是一種獲取攝像頭照片取景器的方法,簡單的實現方法如下,我 ...
DEVELOPER.XIAOYAOLI
技術筆記
簡單的利用UIImagePickerController調用iPhone攝像頭獲取照片的方法,同時介紹了怎麼添加overlay,用於自定義預覽界面
UIImagePickerController是一種獲取攝像頭照片取景器的方法,簡單的實現方法如下,我加了主要的註釋,註意添加
<UIImagePickerControllerDelegate,UINavigationControllerDelegate>這兩個代理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | - (IBAction)cameraBtn:(id)sender { UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init]; imagePicker.delegate = self; imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;//獲取類型是攝像頭,還可以是相冊 imagePicker.modalTransitionStyle = UIModalTransitionStyleCoverVertical; imagePicker.allowsEditing = NO;//如果為NO照出來的照片是原圖,比如4s和5的iPhone出來的尺寸應該是(2000+)*(3000+),差不多800W像素,如果是YES會有個選擇區域的方形方框 // imagePicker.showsCameraControls = NO;//預設是打開的這樣才有拍照鍵,前後攝像頭切換的控制,一半設置為NO的時候用於自定義ovelay // UIImageView *overLayImg = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 640)]; // overLayImg.image = [UIImage imageNamed:@"overlay.png"]; // imagePicker.cameraOverlayView = overLayImg;//3.0以後可以直接設置cameraOverlayView為overlay // imagePicker.wantsFullScreenLayout = YES; [self presentModalViewController:imagePicker animated:YES]; } |
這個代碼就可以實現拍照功能了,如果把註釋掉的代碼加上就可以添加overlayview,比如十字準星,條形碼掃描框之類的
那麼,如何處理獲得的圖像呢?利用下麵的這個代理方法
– (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage *image= [info objectForKey:@”UIImagePickerControllerOriginalImage”];//可以列印一下這個info,如果用的是可編輯的,那就獲取editedImage,不是OriginalImage
NSData *data = UIImageJPEGRepresentation(image, 1);//轉換成JPEG編碼
UIImage *finalImg = [[UIImage imageWithData:data] fixOrientation];
[self saveImage:finalImg WithName:@”salesImageBig.jpg”];
[self dismissModalViewControllerAnimated:YES];
}
大致這些就可以實現拍照獲取照片功能了。
關於OVERLAY的補充
這裡要補充一點,overlay的添加原理雖然很簡單,但是實際應用的時候會遇到一些問題,先說從攝像頭取照片兒時的情況
1 | imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera; |
這個時候沒有狀態欄,經過測試(沒找到文檔),Edit狀態的裁剪視窗是320*320的,Y是75所以我可以精確的把overlay匹配位置
如果是album獲取的,是不可以在創建UIImagePicker的時候設置overlay的,因為cameraOverlayView顧名思義就是為攝像頭準備的,所以要通過UINavigationController的代理方法判斷層級後在當前層級添加overlay
此外這裡就不是75了,是95,因為album取景是有狀態欄的,就像文章最開始的圖片
實現方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated { if ( [navigationController.viewControllers count] == 3 ) { //添加自定義信息層 CameraOverLayFrameView *overLayView = [[[NSBundle mainBundle] loadNibNamed:@"CameraOverLayFrameView" owner:self options:nil] objectAtIndex:0]; CGRect theOverLayFrame = CGRectMake(30, 95, 260, 320); [overLayView setFrame:theOverLayFrame]; [viewController.view addSubview:overLayView]; } } |
至於為什麼是3,試一試就知道了,這一層是navigation推入的第三級視圖
這樣看似大功告成了,但事實上會發現在edit模式里這個overLayerView阻擋了移動和拖拽的手勢,想當然的設定userInterface也沒用,所以需要在自定義的overLayView里實現這個方法:
1 2 3 4 5 6 7 | - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { return NO; } |
這樣就大功告成了