iOS調用系統攝像頭和相冊

nwx8 9年前發布 | 2K 次閱讀 Objective-C IOS

在一些應用中,我們需要用到iOS設備的攝像頭進行拍照,視頻。并且從相冊中選取我們需要的圖片或者視頻。

關于iOS攝像頭和相冊的應用,可以使用UIImagePickerController類來完成控制。

關于UIImagePickerController的相關知識,

如下:


iOS的一些設備上都安裝了攝像頭。現在絕大多數都有了。

在編程中,我們是用相應的東西來進行照相,錄像等功能。


一、UIImagePickerController類

UIImagePickerController 這個類可以為大家提供照相的功能,以及圖片,視頻瀏覽的功能。 


二、檢查硬件是否安裝有攝像頭或者允許操作相冊


這些公共的方法,我們也許會用到,我就貼了!So easy!!!


#pragma mark - 攝像頭和相冊相關的公共類


// 判斷設備是否有攝像頭

- (BOOL) isCameraAvailable{

   return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];

}


// 前面的攝像頭是否可用

- (BOOL) isFrontCameraAvailable{

   return [UIImagePickerControllerisCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront];

}


// 后面的攝像頭是否可用

- (BOOL) isRearCameraAvailable{

   return [UIImagePickerControllerisCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear];

}



// 判斷是否支持某種多媒體類型:拍照,視頻

- (BOOL) cameraSupportsMedia:(NSString *)paramMediaType sourceType:(UIImagePickerControllerSourceType)paramSourceType{

   __block BOOL result = NO;

   if ([paramMediaType length] == ){

     NSLog(@"Media type is empty.");

     return NO;

  }

   NSArray *availableMediaTypes =[UIImagePickerControlleravailableMediaTypesForSourceType:paramSourceType];

  [availableMediaTypes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL*stop) {

                             NSString *mediaType = (NSString *)obj;

                             if ([mediaTypeisEqualToString:paramMediaType]){

                              result = YES;

                              *stop= YES;

                            }

     

  }];

   return result;

}


// 檢查攝像頭是否支持錄像

- (BOOL) doesCameraSupportShootingVideos{

   return [self cameraSupportsMedia:( NSString *)kUTTypeMoviesourceType:UIImagePickerControllerSourceTypeCamera];

}


// 檢查攝像頭是否支持拍照

- (BOOL) doesCameraSupportTakingPhotos{

   return [self cameraSupportsMedia:( NSString *)kUTTypeImagesourceType:UIImagePickerControllerSourceTypeCamera];

}


#pragma mark - 相冊文件選取相關

//相冊是否可用

- (BOOL) isPhotoLibraryAvailable{

   return [UIImagePickerControllerisSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary];

}


//是否可以在相冊中選擇視頻

- (BOOL) canUserPickVideosFromPhotoLibrary{

   return [selfcameraSupportsMedia:( NSString *)kUTTypeMovie sourceType:UIImagePickerControllerSourceTypePhotoLibrary];

}


//是否可以在相冊中選擇視頻

- (BOOL) canUserPickPhotosFromPhotoLibrary{

   return [selfcameraSupportsMedia:( NSString *)kUTTypeImage sourceType:UIImagePickerControllerSourceTypePhotoLibrary];

}


三、用攝像頭進行拍照和錄像功能


1.我們將UIImagePickerController功能寫在一個按鈕的點擊事件中:


 

#pragma mark -拍照按鈕事件


- (void)ClickControlAction:(id)sender{

   //判斷有攝像頭,并且支持拍照功能

  if ([selfisCameraAvailable] && [selfdoesCameraSupportTakingPhotos]){

     // 初始化圖片選擇控制器

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

    [controllersetSourceType:UIImagePickerControllerSourceTypeCamera];//設置類型


     

    //設置所支持的類型,設置只能拍照,或則只能錄像,或者兩者都可以

    NSString *requiredMediaType = (NSString *)kUTTypeImage;

    NSString *requiredMediaType1 = (NSString *)kUTTypeMovie;

    NSArray *arrMediaTypes=[NSArray arrayWithObjects:requiredMediaType, requiredMediaType1,nil];

    [controller setMediaTypes:arrMediaTypes];

     

     // 設置錄制視頻的質量

    [controllersetVideoQuality:UIImagePickerControllerQualityTypeHigh];

     //設置最長攝像時間

    [controller setVideoMaximumDuration:10.f];

     


    [controller setAllowsEditing:YES];//設置是否可以管理已經存在的圖片或者視頻

    [controller setDelegate:self];// 設置代理

    [self.navigationControllerpresentModalViewController:controller animated:YES];

    [controller release];

  }else {

     NSLog(@"Camera is not available.");

  }

}



解釋:


2. setSourceType方法


通過設置setSourceType方法可以確定調用出來的UIImagePickerController所顯示出來的界面


typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {

  UIImagePickerControllerSourceTypePhotoLibrary,

  UIImagePickerControllerSourceTypeCamera,

  UIImagePickerControllerSourceTypeSavedPhotosAlbum

};


分別表示:圖片列表,攝像頭,相機相冊


3.setMediaTypes方法


// 設置所支持的類型,設置只能拍照,或則只能錄像,或者兩者都可以

     NSString *requiredMediaType = ( NSString *)kUTTypeImage;

     NSString *requiredMediaType1 = ( NSString *)kUTTypeMovie;

     NSArray *arrMediaTypes=[NSArray arrayWithObjects:requiredMediaType, requiredMediaType1,nil];

    [controller setMediaTypes:arrMediaTypes];



4.關于UIImagePickerControllerDelegate協議


我們要對我們拍攝的照片和視頻進行存儲,那么就要實現UIImagePickerControllerDelegate協議的方法。


#pragma mark - UIImagePickerControllerDelegate 代理方法



//保存圖片后到相冊后,調用的相關方法,查看是否保存成功

- (void) imageWasSavedSuccessfully:(UIImage *)paramImage didFinishSavingWithError:(NSError *)paramError contextInfo:(void*)paramContextInfo{

  if (paramError == nil){

     NSLog(@"Image was saved successfully.");

  } else {

     NSLog(@"An error happened while saving the image.");

    NSLog(@"Error = %@", paramError);

  }

}


//當得到照片或者視頻后,調用該方法

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{

   NSLog(@"Picker returned successfully.");

  NSLog(@"%@", info);

   NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];

   // 判斷獲取類型:圖片

  if ([mediaType isEqualToString:( NSString *)kUTTypeImage]){

    UIImage*theImage = nil;

     // 判斷,圖片是否允許修改

    if ([pickerallowsEditing]){

       //獲取用戶編輯之后的圖像

      theImage = [info objectForKey:UIImagePickerControllerEditedImage];

    } else {

      // 照片的元數據參數

      theImage = [info objectForKey:UIImagePickerControllerOriginalImage];

       

    }

     

     // 保存圖片到相冊中

    SELselectorToCall = @selector(imageWasSavedSuccessfully:didFinishSavingWithError:contextInfo:);

    UIImageWriteToSavedPhotosAlbum(theImage,self,selectorToCall,NULL);

     

  }else if([mediaType isEqualToString:(NSString *)kUTTypeMovie]){

     // 判斷獲取類型:視頻

     //獲取視頻文件的url

     NSURL* mediaURL = [info objectForKey:UIImagePickerControllerMediaURL];

     //創建ALAssetsLibrary對象并將視頻保存到媒體庫

    // Assets Library 框架包是提供了在應用程序中操作圖片和視頻的相關功能。相當于一個橋梁,鏈接了應用程序和多媒體文件。

    ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc] init];

     // 將視頻保存到相冊中

    [assetsLibrarywriteVideoAtPathToSavedPhotosAlbum:mediaURL

                     completionBlock:^(NSURL *assetURL, NSError *error) {

                       if (!error) {

                         NSLog(@"captured video saved with no error.");

                       }else{

                         NSLog(@"error occured while saving the video:%@", error);

                       }

                     }];

    [assetsLibrary release];

   

   

  }

   

   

  [picker dismissModalViewControllerAnimated:YES];

}




//當用戶取消時,調用該方法

- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker{

   

  [picker dismissModalViewControllerAnimated:YES];

}


四、從相冊獲取圖片和視頻數據


1.我們將功能封裝在一個按鈕的點擊事件中


#pragma mark - 相冊操作


- (void)ClickShowPhotoAction:(id)sender{

   

   if([self isPhotoLibraryAvailable]){

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

     [controller setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];//設置類型

    NSMutableArray *mediaTypes = [[NSMutableArray alloc] init];

     if ([selfcanUserPickPhotosFromPhotoLibrary]){

      [mediaTypes addObject:(NSString *)kUTTypeImage];

    }

     if ([selfcanUserPickVideosFromPhotoLibrary]){

      [mediaTypes addObject:(NSString *)kUTTypeMovie];

    }

     

    [controller setMediaTypes:mediaTypes];

    [controller setDelegate:self];// 設置代理

    [self.navigationControllerpresentModalViewController:controller animated:YES];

    [controller release];

    [mediaTypes release];

     

  }



}


2.關于UIImagePickerControllerDelegate協議,我們可以重用。


在這里,就不用贅述了!


最后,需要說的是,UIImagePickerControllerDelegate協議中

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary*)info方法,中的info值,會根據我們操作的類型不同,而產生了不同的數據信息:


當操作的為圖片時::


 

{

  UIImagePickerControllerCropRect = "NSRect: {{0, 405}, {2448, 2449}}";

  UIImagePickerControllerEditedImage = "";

  UIImagePickerControllerMediaMetadata =   {

    DPIHeight = 72;

    DPIWidth = 72;

    Orientation = 6;

    "{Exif}" =     {

      ApertureValue = "2.526068811667588";

      BrightnessValue = "-0.0709875088566263";

      ColorSpace = 1;

      DateTimeDigitized = "2013:04:05 16:43:00";

      DateTimeOriginal = "2013:04:05 16:43:00";

      ExposureMode = 0;

      ExposureProgram = 2;

      ExposureTime = "0.05882352941176471";

      FNumber = "2.4";

      Flash = 24;

      FocalLenIn35mmFilm = 35;

      FocalLength = "4.28";

      ISOSpeedRatings =       (

        400

      );

      MeteringMode = 5;

      PixelXDimension = 3264;

      PixelYDimension = 2448;

      SceneType = 1;

      SensingMethod = 2;

      Sharpness = 0;

      ShutterSpeedValue = "4.099543917546131";

      SubjectArea =       (

        1631,

        1223,

        881,

        881

      );

      WhiteBalance = 0;

    };

    "{TIFF}" =     {

      DateTime = "2013:04:05 16:43:00";

      Make = Apple;

      Model = "iPhone 4S";

      Software = "5.1.1";

      XResolution = 72;

      YResolution = 72;

    };

  };

  UIImagePickerControllerMediaType = "public.image";

  UIImagePickerControllerOriginalImage = "";

}


當我們操作的為視頻時:


{

  UIImagePickerControllerMediaType = "public.movie";

  UIImagePickerControllerMediaURL = "file://localhost/private/var/mobile/Applications/22A14825-DD7E-48E1-A1D5-2D85B82095B5/tmp/capture-T0x1363a0.tmp.etXfD4/capturedvideo.MOV";

}


希望對你有所幫助!


 本文由用戶 nwx8 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!