UIImagePickerController擷取照片的實現,添加overlay方法 (相機取景框),
DEVELOPER.XIAOYAOLI技術筆記
簡單的利用UIImagePickerController調用iPhone網路攝影機擷取照片的方法,同時介紹了怎麼添加overlay,用於自訂預覽介面
UIImagePickerController是一種擷取網路攝影機照片取景器的方法,簡單的實現方法如下,我加了主要的注釋,注意添加
<UIImagePickerControllerDelegate,UINavigationControllerDelegate>這兩個代理
12345678910111213141516171819202122232425 |
- (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取景是有狀態列的,就像文章最開始的圖片
實現方法:
1234567891011121314151617 |
- (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裡實現這個方法:
1234567 |
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { return NO; } |
這樣就大功告成了