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

來源:互聯網
上載者:User

 


在一些應用中,我們需要用到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.