UIImagePickerController擷取照片的實現,添加overlay方法 (相機取景框),

來源:互聯網
上載者:User

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; }

 

這樣就大功告成了

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.