IOS 攝像頭使用(1)-UIImagePickerController


IOS有兩種拍照與拍攝視頻的方式

1.  直接使用UIImagePickerController, 這可以提供一個簡單便捷的拍照與選擇圖庫里圖片的功能.

2.另一種方式就是通過AV Foundation framework,來完全自定義拍照的界面與選擇圖庫的界面.

這里介紹第一種, 如何使用UIImagePickerController.

一.拍照

步驟

1. 定義UIImagePickerController, 啟動拍照界面

(1)首先攝像頭對於你的應用是必須的,那你應該在項目的Info.plist的Required device capabilities里添加自己要的設備.這里有相關的設備描述.

(2) 要確保你的設備可用,所以在代碼中最好先用UIImagePickerController的isSourceTypeAvailable:方面來判斷一下,否則如果直接寫邏輯,那在設備不可用時,程序會拋異常.

 (3)  在拍攝完后,想要能夠關掉拍攝界面,那就必須要實現UIImagePickerControllerDelegate

UIImagePickerController 里有幾個比較重要的屬性.

 Source type:  這個參數是用來確定是調用攝像頭還是調用圖片庫.如果是 UIImagePickerControllerSourceTypeCamera 就是調用攝像頭,如果是UIImagePickerControllerSourceTypePhotoLibrary 就是調用圖片庫,如果是UIImagePickerControllerSourceTypeSavedPhotosAlbum 則調用iOS設備中的膠卷相機的圖片.

Media types:在拍照時,用來指定是拍靜態的圖片還是錄像.kUTTypeImage 表示靜態圖片, kUTTypeMovie表示錄像.

Editing controls :用來指定是否可編輯.將allowsEditing 屬性設置為YES表示可編輯,NO表示不可編輯.

示例代碼:(來源於apple官方文檔)

 

- (BOOL) startCameraControllerFromViewController: (UIViewController*) controller
                                   usingDelegate: (id <UIImagePickerControllerDelegate,
                                           UINavigationControllerDelegate>) delegate 
{

    // here, check the device is available  or not
    if (([UIImagePickerController isSourceTypeAvailable:
                UIImagePickerControllerSourceTypeCamera] == NO)
            || (delegate == nil)|| (controller == nil))
        return NO;

    UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init];

    cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera;

    // Displays a control that allows the user to choose picture or
    // movie capture, if both are available:

    cameraUI.mediaTypes = [UIImagePickerControlleravailableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];

    // Hides the controls for moving & scaling pictures, or for
    // trimming movies. To instead show the controls, use YES.
    cameraUI.allowsEditing = NO;
    cameraUI.delegate = delegate;

    [controller presentModalViewController: cameraUI animated: YES];

    returnYES;
}

 

如果只想讓攝像頭只能攝像,而不能拍照,那應該設置mediaTypes

cameraUI.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *)  kUTTypeMovie  , nil];
 kUTTypeImage 對應拍照
 kUTTypeMovie  對應攝像
這要導入MobileCoreServices.framework,然后再

#import <MobileCoreServices/UTCoreTypes.h>

然后就可以在一個觸發事件中進行調用.

- (IBAction) showCameraUI {
    [self startCameraControllerFromViewController: self
                                    usingDelegate: self];
}

 

2. 設置delegate

在拍攝完成后,要進行delegate的設置,這樣才能夠讓程序互動起來. 

  UIImagePickerControllerDelegate在方法主要有兩個,
- (void) imagePickerControllerDidCancel: (UIImagePickerController *) picker ; 點擊cancel后執行的方法
- (void) imagePickerController: (UIImagePickerController *) picker
            didFinishPickingMediaWithInfo: (NSDictionary *) info; 拍攝完成后要執行的方法
 
code:
 
// For responding to the user tapping Cancel.
- (void) imagePickerControllerDidCancel: (UIImagePickerController *) picker {
 
    [[picker parentViewController] dismissModalViewControllerAnimated: YES];
    [picker release];
}
 
 
 
 
// For responding to the user accepting a newly-captured picture or movie
- (void) imagePickerController: (UIImagePickerController *) picker
            didFinishPickingMediaWithInfo: (NSDictionary *) info {
 
    NSString *mediaType = [info objectForKey: UIImagePickerControllerMediaType];
    UIImage *originalImage, *editedImage, *imageToSave;
 
    // Handle a still image capture
    if (CFStringCompare ((CFStringRef) mediaType, kUTTypeImage, 0)
            == kCFCompareEqualTo) {
 
        editedImage = (UIImage *) [info objectForKey:
                    UIImagePickerControllerEditedImage];
        originalImage = (UIImage *) [info objectForKey:
                    UIImagePickerControllerOriginalImage];
 
        if (editedImage) {
            imageToSave = editedImage;
        } else {
            imageToSave = originalImage;
        }
 
    // Save the new image (original or edited) to the Camera Roll
        UIImageWriteToSavedPhotosAlbum (imageToSave, nil, nil , nil);
    }
 
    // Handle a movie capture
    if (CFStringCompare ((CFStringRef) mediaType, kUTTypeMovie, 0)
            == kCFCompareEqualTo) {
 
        NSString *moviePath = [[info objectForKey:
                    UIImagePickerControllerMediaURL] path];
 
        if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum (moviePath)) {
            UISaveVideoAtPathToSavedPhotosAlbum (
                    moviePath, nil, nil, nil);
        }
    }
 
    [[picker parentViewController] dismissModalViewControllerAnimated: YES];
    [picker release];
}

 

// 這個方法就是在拍攝完成后,將圖片或視頻,保存到膠卷相機. 我們所需要的東西都保存在info 這個 NSDictionary中
 
 
二. 從圖片庫中選擇圖片
在選擇圖片中,ipad 與iphone 會有些不同, ipad展示圖片展時,必須要以popover的形式展示,如果想打開一個頁面,來modal展示的話,會拋出異常.
這里要設置的屬性只要是將
source type改為 UIImagePickerControllerSourceTypePhotoLibrary 或UIImagePickerControllerSourceTypeSavedPhotosAlbum,這個是根據自己選擇來定.
mediatype的設置與上面的拍照一樣.
代碼:
如果是iPhone,則代碼與上面拍照的一樣,只要改下source type就可以了.但如果是ipad,會有所不同,下面的代碼就是ipad為例.
在interface中:

@property (strong,nonatomic) UIPopoverController * popoverViewControl;

在implement中:

- (IBAction)takeImage:(id)sender {
    if ([self.popoverViewControl isPopoverVisible])
    {
        [self.popoverViewControl dismissPopoverAnimated:YES];
    }else {
        if ([UIImagePickerController isSourceTypeAvailable:
             UIImagePickerControllerSourceTypeSavedPhotosAlbum])
        {
            UIImagePickerController * picker = [[UIImagePickerController alloc] init];
            picker.delegate = self;
            picker.allowsEditing = NO;
            picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
          //  picker.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeSavedPhotosAlbum];
            picker.mediaTypes = [[NSArray alloc] initWithObjects:(NSString *)  kUTTypeMovie , nil];
            self.popoverViewControl = [[UIPopoverControlleralloc] initWithContentViewController:picker];
            self.popoverViewControl.delegate = self;
            
            CGRect popoverRect = [self.view convertRect:[sender frame] 
                                               fromView:[sender superview]];  
            popoverRect.size.width = MIN(popoverRect.size.width, 100);
            [self.popoverViewControl presentPopoverFromRect:popoverRect inView:self.view             permittedArrowDirections:UIPopoverArrowDirectionAnyanimated:YES];
        }
     }
}
 
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    self.imageView.image = [info objectForKey:UIImagePickerControllerOriginalImage];    //imageview是自己定義的一個image view 控件,用來顯示選中的圖片
    [self.popoverViewControldismissPopoverAnimated:YES];
}

 

以上就是UIImagePickerController的大概用法,主要就是自己看了apple的官方文檔,然后實踐后,記錄下來,留用,防止忘了.

對於popover 有一個很好的教程: Using the PopoverView in iPad App Development


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM