iOS網路攝影機和相簿-UIImagePickerController-淺析

來源:互聯網
上載者:User

標籤:style   blog   http   color   get   使用   

原文地址:http://blog.sina.com.cn/s/blog_7b9d64af0101cfd9.html-淺析貞娃兒


在一些應用中,我們需要用到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] == 0){
        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 [UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypePhotoLibrary];
}


// 是否可以在相簿中選擇視頻
- (BOOL) canUserPickVideosFromPhotoLibrary{
    return [self cameraSupportsMedia:( NSString *)kUTTypeMovie sourceType:UIImagePickerControllerSourceTypePhotoLibrary];
}


// 是否可以在相簿中選擇視頻
- (BOOL) canUserPickPhotosFromPhotoLibrary{
    return [self cameraSupportsMedia:( NSString *)kUTTypeImage sourceType:UIImagePickerControllerSourceTypePhotoLibrary];
}


三、用網路攝影機進行拍照和錄影功能


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


 
#pragma mark - 拍照按鈕事件


- (void)ClickControlAction:(id)sender{
    // 判斷有網路攝影機,並且支援拍照功能
    if ([self isCameraAvailable] && [self doesCameraSupportTakingPhotos]){
        // 初始化圖片選擇控制器
        UIImagePickerController *controller = [[UIImagePickerController alloc] init];
        [controller setSourceType:UIImagePickerControllerSourceTypeCamera];// 設定類型


        
        // 設定所支援的類型,設定只能拍照,或則只能錄影,或者兩者都可以
        NSString *requiredMediaType = ( NSString *)kUTTypeImage;
        NSString *requiredMediaType1 = ( NSString *)kUTTypeMovie;
        NSArray *arrMediaTypes=[NSArray arrayWithObjects:requiredMediaType, requiredMediaType1,nil];
        [controller setMediaTypes:arrMediaTypes];
        
        // 設定錄製視頻的品質
        [controller setVideoQuality:UIImagePickerControllerQualityTypeHigh];
        //設定最長攝像時間
        [controller setVideoMaximumDuration:10.f];
        


        [controller setAllowsEditing:YES];// 設定是否可以管理已經存在的圖片或者視頻
        [controller setDelegate:self];// 設定代理
        [self.navigationController presentModalViewController: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 ([picker allowsEditing]){
            //擷取使用者編輯之後的映像
            theImage = [info objectForKey:UIImagePickerControllerEditedImage];
        } else {
            // 照片的中繼資料參數
            theImage = [info objectForKey:UIImagePickerControllerOriginalImage];
            
        }
        
        // 儲存圖片到相簿中
        SEL selectorToCall = @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];
        // 將視頻儲存到相簿中
        [assetsLibrary writeVideoAtPathToSavedPhotosAlbum: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 ([self canUserPickPhotosFromPhotoLibrary]){
            [mediaTypes addObject:( NSString *)kUTTypeImage];
        }
        if ([self canUserPickVideosFromPhotoLibrary]){
            [mediaTypes addObject:( NSString *)kUTTypeMovie];
        }
        
        [controller setMediaTypes:mediaTypes];
        [controller setDelegate:self];// 設定代理
        [self.navigationController presentModalViewController: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";
}


希望對你有所協助!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.