在一些應用中,我們需要用到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;
}
希望對你有所協助!