前言
NS_CLASS_AVAILABLE_IOS(2_0) @interface UIImagePickerController : UINavigationController <NSCoding>
@available(iOS 2.0, *) public class UIImagePickerController : UINavigationController, NSCoding
-
iOS 獲取圖片有三種方法:
- 直接調用攝像頭拍照;
- 從相冊中選擇;
- 從圖庫中選擇。
-
UIImagePickerController 是系統提供的用來獲取圖片和視頻的接口。用 UIImagePickerController 類來獲取圖片視頻,大體分為以下幾個步驟:
- 初始化 UIImagePickerController 類;
- 設置 UIImagePickerController 實例的數據來源類型;
- 設置代理;
- 如果需要做圖片修改的話設置 allowsEditing = YES。
1、imagePickerController 的創建
-
Objective-C
-
需遵守協議 UIImagePickerControllerDelegate, UINavigationControllerDelegate
// 實例化 UIImagePickerController 對象 UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; // 設置代理 imagePickerController.delegate = self; // 設置是否需要做圖片編輯,default NO imagePickerController.allowsEditing = YES; // 判斷數據來源是否可用 if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { // 設置數據來源 imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; // 打開相機/相冊/圖庫 [self presentViewController:imagePickerController animated:YES completion:nil]; } // UIImagePickerControllerDelegate 協議方法 // 取消選擇 - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { // 退出當前界面 [picker dismissViewControllerAnimated:YES completion:nil]; } // 選擇完成 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height - 20)]; [self.view addSubview:imageView]; // 獲取點擊的圖片 imageView.image = [info objectForKey:UIImagePickerControllerOriginalImage]; [picker dismissViewControllerAnimated:YES completion:nil]; }
-
-
Swift
-
需遵守協議 UIImagePickerControllerDelegate, UINavigationControllerDelegate
// 實例化 UIImagePickerController 對象 let imagePickerController = UIImagePickerController() // 設置代理 imagePickerController.delegate = self // 設置是否需要做圖片編輯,default NO. imagePickerController.allowsEditing = true // 判斷數據來源是否可用 if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) { // 設置數據來源 imagePickerController.sourceType = UIImagePickerControllerSourceType.PhotoLibrary // 打開相機/相冊/圖庫 self.presentViewController(imagePickerController, animated: true, completion: nil) } // UIImagePickerControllerDelegate 協議方法 // 取消選擇 func imagePickerControllerDidCancel(picker: UIImagePickerController) { // 退出當前界面 picker.dismissViewControllerAnimated(true, completion: nil) } // 選擇完成 func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { let imageView = UIImageView(frame: CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height - 20)) self.view.addSubview(imageView) // 獲取點擊的圖片 imageView.image = info[UIImagePickerControllerOriginalImage] as? UIImage picker.dismissViewControllerAnimated(true, completion: nil) }
-
2、imagePickerController 的設置
-
Objective-C
// 設置代理,需遵守 UIImagePickerControllerDelegate, UINavigationControllerDelegate 協議 imagePickerController.delegate = self; // 設置是否需要做圖片編輯 imagePickerController.allowsEditing = YES; // 判斷設備數據來源是否支持 /* UIImagePickerControllerSourceTypePhotoLibrary, // 來自圖庫 UIImagePickerControllerSourceTypeCamera, // 來自相機 UIImagePickerControllerSourceTypeSavedPhotosAlbum // 來自相冊 */ if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { } // 判斷攝像頭是否支持 /* UIImagePickerControllerCameraDeviceRear, // 后置攝像頭 UIImagePickerControllerCameraDeviceFront // 前置攝像頭 */ if ([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear]) { } // 判斷閃光燈是否支持 if ([UIImagePickerController isFlashAvailableForCameraDevice:UIImagePickerControllerCameraDeviceFront]) { } // 獲取數據來源支持的媒體類型 /* UIImagePickerControllerSourceTypePhotoLibrary, // 來自圖庫 "public.image", "public.movie" UIImagePickerControllerSourceTypeCamera, // 來自相機 ... UIImagePickerControllerSourceTypeSavedPhotosAlbum // 來自相冊 "public.image", "public.movie" */ NSArray *mediaTypesArray = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeSavedPhotosAlbum]; // 獲取相機擁有的模式 /* UIImagePickerControllerCameraDeviceRear, // 后置攝像頭 ... UIImagePickerControllerCameraDeviceFront // 前置攝像頭 ... */ NSArray *captureModesArray = [UIImagePickerController availableCaptureModesForCameraDevice:UIImagePickerControllerCameraDeviceFront]; // 設置數據來源 /* UIImagePickerControllerSourceTypePhotoLibrary, // 來自圖庫,默認 UIImagePickerControllerSourceTypeCamera, // 來自相機 UIImagePickerControllerSourceTypeSavedPhotosAlbum // 來自相冊 */ imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; // 設置媒體類型 /* kUTTypeImage 包含: kUTTypeImage; // 抽象的圖片類型 kUTTypeJPEG; kUTTypeJPEG2000; kUTTypeTIFF; kUTTypePICT; kUTTypeGIF; kUTTypePNG; kUTTypeQuickTimeImage; kUTTypeAppleICNS; kUTTypeBMP; kUTTypeICO kUTTypeMovie 包含: kUTTypeAudiovisualContent; // 抽象的聲音視頻 kUTTypeMovie; // 抽象的媒體格式(聲音和視頻) kUTTypeVideo; // 只有視頻沒有聲音 kUTTypeAudio; // 只有聲音沒有視頻 kUTTypeQuickTimeMovie; kUTTypeMPEG; kUTTypeMPEG4; kUTTypeMP3; kUTTypeMPEG4Audio; kUTTypeAppleProtectedMPEG4Audio 需要 #import <MobileCoreServices/MobileCoreServices.h> 才能用 kUTTypeImage 和 KUTTypeMovie 。 default value is an array containing kUTTypeImage. */ imagePickerController.mediaTypes = @[(NSString *)kUTTypeImage, (NSString *)kUTTypeMovie]; // 設置攝像頭 /* UIImagePickerControllerCameraDeviceRear, // 后置攝像頭,默認 UIImagePickerControllerCameraDeviceFront // 前置攝像頭 */ imagePickerController.cameraDevice = UIImagePickerControllerCameraDeviceFront; // 設置相機模式 /* UIImagePickerControllerCameraCaptureModePhoto, // 照相模式,默認 UIImagePickerControllerCameraCaptureModeVideo // 錄像模式 */ imagePickerController.cameraCaptureMode = UIImagePickerControllerCameraCaptureModePhoto; // 設置閃光燈模式 /* UIImagePickerControllerCameraFlashModeOff = -1, // 關 UIImagePickerControllerCameraFlashModeAuto = 0, // 自動,默認 UIImagePickerControllerCameraFlashModeOn = 1 // 開 */ imagePickerController.cameraFlashMode = UIImagePickerControllerCameraFlashModeOn; // 設置錄像質量 /* UIImagePickerControllerQualityTypeHigh = 0, // 高質量,highest quality UIImagePickerControllerQualityTypeMedium = 1, // 中質量,默認,Wi-Fi UIImagePickerControllerQualityTypeLow = 2, // 低質量,cellular network UIImagePickerControllerQualityType640x480 = 3, // VGA 質量,VGA quality UIImagePickerControllerQualityTypeIFrame1280x720 = 4, UIImagePickerControllerQualityTypeIFrame960x540 = 5 apply only if mediaTypes includes kUTTypeMovie */ imagePickerController.videoQuality = UIImagePickerControllerQualityTypeHigh; // 設置錄像時間長度 /* default is 10 minutes. apply only mediaTypes includes kUTTypeMovie */ imagePickerController.videoMaximumDuration = 600; // 設置是否顯示相機原生 UI /* set to NO to hide all standard camera UI. default is YES. available sourceType is Camera. */ imagePickerController.showsCameraControls = YES; // 自定義相機視圖 /* set a view to overlay the preview view. default is YES. available sourceType is Camera. */ imagePickerController.cameraOverlayView = myView; // 改變相機視圖 /* set the transform of the preview view. default is YES. available sourceType is Camera. 旋轉 45 度,需要輸入的參數為弧度,45/180 * M_PI,1 度 = PI/180 弧度 */ imagePickerController.cameraViewTransform = CGAffineTransformMakeRotation(0.25 * M_PI); // 打開相機/相冊/圖庫 /* 訪問設置的數據來源界面 */ [self presentViewController:imagePickerController animated:YES completion:nil]; // 拍照 /* 拍攝照片 */ [imagePickerController takePicture]; // 錄像 // 開始錄像 [imagePickerController startVideoCapture]; // 停止錄像 [imagePickerController stopVideoCapture]; // 退出當前界面(相機/相冊/圖庫) /* 在 UIImagePickerControllerDelegate 協議方法中調用 */ [picker dismissViewControllerAnimated:YES completion:nil]; // 獲取選取媒體類型(圖片或者視頻) /* 選取的信息都在 info 中,info 是一個字典。字典中的鍵: UIImagePickerControllerMediaType; // 指定用戶選擇的媒體類型,包含着 kUTTypeImage 和 kUTTypeMovie UIImagePickerControllerOriginalImage; // 原始圖片 UIImagePickerControllerEditedImage; // 修改后的圖片,只有打開編輯模式 info 里才有此鍵值對 UIImagePickerControllerCropRect; // 裁剪尺寸,只有打開編輯模式 info 里才有此鍵值對 UIImagePickerControllerMediaURL; // 媒體的 URL UIImagePickerControllerReferenceURL; // 原件的 URL UIImagePickerControllerMediaMetadata // 當數據來源是照相機的時候這個值才有效 kUTTypeImage 包含: kUTTypeImage; // 抽象的圖片類型 kUTTypeJPEG; kUTTypeJPEG2000; kUTTypeTIFF; kUTTypePICT; kUTTypeGIF; kUTTypePNG; kUTTypeQuickTimeImage; kUTTypeAppleICNS; kUTTypeBMP; kUTTypeICO kUTTypeMovie 包含: kUTTypeAudiovisualContent; // 抽象的聲音視頻 kUTTypeMovie; // 抽象的媒體格式(聲音和視頻) kUTTypeVideo; // 只有視頻沒有聲音 kUTTypeAudio; // 只有聲音沒有視頻 kUTTypeQuickTimeMovie; kUTTypeMPEG; kUTTypeMPEG4; kUTTypeMP3; kUTTypeMPEG4Audio; kUTTypeAppleProtectedMPEG4Audio 需要 #import <MobileCoreServices/MobileCoreServices.h> 才能用 kUTTypeImage 和 KUTTypeMovie 。 */ // 直接處理點擊的媒體資源 UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height - 20)]; [self.view addSubview:imageView]; // 獲取點擊的圖片 imageView.image = [info objectForKey:UIImagePickerControllerOriginalImage]; // 先判斷點擊的資源類型再處理 // 判斷點擊的媒體資源類型 if ([[info objectForKey:UIImagePickerControllerMediaType] isEqualToString:(NSString *)kUTTypeImage]) { UIImageView *headerImageView = [[UIImageView alloc] initWithFrame:CGRectMake(20, 40, 100, 100)]; headerImageView.layer.borderColor = [[UIColor greenColor] CGColor]; headerImageView.layer.borderWidth = 3; [self.view addSubview:headerImageView]; // 獲取點擊的圖片 headerImageView.image = [info objectForKey:UIImagePickerControllerEditedImage]; }
-
Swift
// 設置代理,需遵守 UIImagePickerControllerDelegate, UINavigationControllerDelegate 協議 imagePickerController.delegate = self // 設置是否需要做圖片編輯 imagePickerController.allowsEditing = true // 判斷設備數據來源是否支持 /* case PhotoLibrary // 來自圖庫 case Camera // 來自相機 case SavedPhotosAlbum // 來自相冊 */ if UIImagePickerController.isSourceTypeAvailable(.PhotoLibrary) { } // 判斷攝像頭是否支持 /* case Rear // 后置攝像頭 case Front // 前置攝像頭 */ if UIImagePickerController.isCameraDeviceAvailable(.Rear) { } // 判斷閃光燈是否支持 if UIImagePickerController.isFlashAvailableForCameraDevice(.Front) { } // 獲取數據來源支持的媒體類型 /* PhotoLibrary, // 來自圖庫 "public.image", "public.movie" Camera, // 來自相機 ... SavedPhotosAlbum // 來自相冊 "public.image", "public.movie" */ let mediaTypesArray = UIImagePickerController.availableMediaTypesForSourceType(.SavedPhotosAlbum) // 獲取相機擁有的模式 /* Rear, // 后置攝像頭 ... Front // 前置攝像頭 ... */ let captureModesArray = UIImagePickerController.availableCaptureModesForCameraDevice(.Front) // 設置數據來源 /* case PhotoLibrary // 來自圖庫 case Camera // 來自相機 case SavedPhotosAlbum // 來自相冊 */ imagePickerController.sourceType = .PhotoLibrary // 設置媒體類型 /* kUTTypeImage 包含: kUTTypeImage; // 抽象的圖片類型 kUTTypeJPEG; kUTTypeJPEG2000; kUTTypeTIFF; kUTTypePICT; kUTTypeGIF; kUTTypePNG; kUTTypeQuickTimeImage; kUTTypeAppleICNS; kUTTypeBMP; kUTTypeICO kUTTypeMovie 包含: kUTTypeAudiovisualContent; // 抽象的聲音視頻 kUTTypeMovie; // 抽象的媒體格式(聲音和視頻) kUTTypeVideo; // 只有視頻沒有聲音 kUTTypeAudio; // 只有聲音沒有視頻 kUTTypeQuickTimeMovie; kUTTypeMPEG; kUTTypeMPEG4; kUTTypeMP3; kUTTypeMPEG4Audio; kUTTypeAppleProtectedMPEG4Audio 需要 import MobileCoreServices 才能用 kUTTypeImage 和 KUTTypeMovie 。 default value is an array containing kUTTypeImage. */ imagePickerController.mediaTypes = [String(kUTTypeImage), String(kUTTypeMovie)] // 設置攝像頭 /* Rear, // 后置攝像頭,默認 Front // 前置攝像頭 */ imagePickerController.cameraDevice = .Front // 設置相機模式 /* Photo, // 照相模式,默認 Video // 錄像模式 */ imagePickerController.cameraCaptureMode = .Photo // 設置閃光燈模式 /* Off = -1, // 關 Auto = 0, // 自動,默認 On = 1 // 開 */ imagePickerController.cameraFlashMode = .On // 設置錄像質量 /* TypeHigh = 0, // 高質量, highest quality TypeMedium = 1, // 中質量,默認, medium quality, Wi-Fi TypeLow = 2, // 低質量, lowest quality, cellular network Type640x480 = 3, // VGA 質量, VGA quality TypeIFrame1280x720 = 4, TypeIFrame960x540 = 5 apply only if mediaTypes includes kUTTypeMovie */ imagePickerController.videoQuality = .TypeHigh // 設置錄像時間長度 /* default is 10 minutes. apply only mediaTypes includes kUTTypeMovie */ imagePickerController.videoMaximumDuration = 600 // 設置是否顯示相機原生 UI /* set to NO to hide all standard camera UI. default is YES. available sourceType is Camera. */ imagePickerController.showsCameraControls = true // 自定義相機視圖 /* set a view to overlay the preview view. default is YES. available sourceType is Camera. */ imagePickerController.cameraOverlayView = myView // 改變相機視圖 /* set the transform of the preview view. default is YES. available sourceType is Camera. 旋轉 45 度,需要輸入的參數為弧度,45/180 * M_PI,1 度 = PI/180 弧度 */ imagePickerController.cameraViewTransform = CGAffineTransformMakeRotation(0.25 * CGFloat(M_PI)) // 打開相機/相冊/圖庫 /* 訪問設置的數據來源界面 */ self.presentViewController(imagePickerController, animated: true, completion: nil) // 拍照 /* 拍攝照片 */ imagePickerController.takePicture() // 錄像 // 開始錄像 imagePickerController.startVideoCapture() // 停止錄像 imagePickerController.stopVideoCapture() // 退出當前界面(相機/相冊/圖庫) /* 在 UIImagePickerControllerDelegate 協議方法中調用 */ picker.dismissViewControllerAnimated(true, completion: nil) // 獲取選取媒體類型(圖片或者視頻) /* 選取的信息都在 info 中,info 是一個字典。字典中的鍵: UIImagePickerControllerMediaType; // 指定用戶選擇的媒體類型,包含着 kUTTypeImage 和 kUTTypeMovie UIImagePickerControllerOriginalImage; // 原始圖片 UIImagePickerControllerEditedImage; // 修改后的圖片,只有打開編輯模式 info 里才有此鍵值對 UIImagePickerControllerCropRect; // 裁剪尺寸,只有打開編輯模式 info 里才有此鍵值對 UIImagePickerControllerMediaURL; // 媒體的 URL UIImagePickerControllerReferenceURL; // 原件的 URL UIImagePickerControllerMediaMetadata // 當數據來源是照相機的時候這個值才有效 kUTTypeImage 包含: kUTTypeImage; // 抽象的圖片類型 kUTTypeJPEG; kUTTypeJPEG2000; kUTTypeTIFF; kUTTypePICT; kUTTypeGIF; kUTTypePNG; kUTTypeQuickTimeImage; kUTTypeAppleICNS; kUTTypeBMP; kUTTypeICO kUTTypeMovie 包含: kUTTypeAudiovisualContent; // 抽象的聲音視頻 kUTTypeMovie; // 抽象的媒體格式(聲音和視頻) kUTTypeVideo; // 只有視頻沒有聲音 kUTTypeAudio; // 只有聲音沒有視頻 kUTTypeQuickTimeMovie; kUTTypeMPEG; kUTTypeMPEG4; kUTTypeMP3; kUTTypeMPEG4Audio; kUTTypeAppleProtectedMPEG4Audio 需要 import MobileCoreServices 才能用 kUTTypeImage 和 KUTTypeMovie 。 */ // 直接處理點擊的媒體資源 let imageView = UIImageView(frame: CGRectMake(0, 20, self.view.frame.size.width, self.view.frame.size.height - 20)) self.view.addSubview(imageView) // 獲取點擊的圖片 imageView.image = info[UIImagePickerControllerOriginalImage] as? UIImage // 先判斷點擊的資源類型再處理 // 判斷點擊的媒體資源類型 if (info[UIImagePickerControllerMediaType]?.isEqualToString(String(kUTTypeImage)) != nil) { let headerImageView = UIImageView(frame: CGRectMake(20, 40, 100, 100)) headerImageView.layer.borderColor = UIColor.greenColor().CGColor headerImageView.layer.borderWidth = 3 self.view.addSubview(headerImageView) // 獲取點擊的圖片 headerImageView.image = info[UIImagePickerControllerEditedImage] as? UIImage }
3、UIImagePickerControllerDelegate 協議方法
-
Objective-C
// 取消選擇,點擊界面中的取消(Cancel)按鈕時觸發 - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { } // 選擇完成,點擊界面中的某個圖片或者選擇(Choose)按鈕時觸發 - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { }
-
Swift
// 取消選擇,點擊界面中的取消(Cancel)按鈕時觸發 func imagePickerControllerDidCancel(picker: UIImagePickerController) { } // 選擇完成,點擊界面中的某個圖片或者選擇(Choose)按鈕時觸發 func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { }