iOS從相冊和照相機讀取圖片(UIImagePickerController)

前言

UIKit框架提供了一個圖像選擇器UIImagePickerController,我們不僅可以從相冊中選擇圖像資源,還可以從照相機中直接獲取拍攝的圖像。

UIImagePickerController的創(chuàng)建

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

UIImagePickerController繼承于UINavigationController,所以我們可以在當前通過以下方法調(diào)出:

[self presentViewController:imagePicker animated:YES completion:nil];

sourceType屬性

sourceType屬性是設置UIImagePickerController的圖片選擇源的,我們通過 sourceType來設置將要從相冊、相機還是相機膠卷選擇圖片。

@property(nonatomic) UIImagePickerControllerSourceType sourceType; // default value is UIImagePickerControllerSourceTypePhotoLibrary.
typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {
    // 相冊
    UIImagePickerControllerSourceTypePhotoLibrary,
    // 相機
    UIImagePickerControllerSourceTypeCamera,
    // 相機膠卷
    UIImagePickerControllerSourceTypeSavedPhotosAlbum
} __TVOS_PROHIBITED;

相機膠卷是相冊下的一個分類,該文件夾下的圖片均是相機拍攝產(chǎn)生的圖片


其他屬性

  • // 是否可以編輯
@property(nonatomic) BOOL allowsEditing NS_AVAILABLE_IOS(3_1); // replacement for -allowsImageEditing; default value is NO.
  • // 是否可以編輯圖像
@property(nonatomic) BOOL allowsImageEditing NS_DEPRECATED_IOS(2_0, 3_1);
  • // 圖像類型
@property(nonatomic,copy) NSArray<NSString *> *mediaTypes;
// default value is an array containing kUTTypeImage.
  • // 視頻類型圖像最大時長
// video properties apply only if mediaTypes includes kUTTypeMovie
@property(nonatomic) NSTimeInterval videoMaximumDuration NS_AVAILABLE_IOS(3_1); 
// default value is 10 minutes.
  • // 圖像質(zhì)量類型
@property(nonatomic) UIImagePickerControllerQualityType videoQuality NS_AVAILABLE_IOS(3_1);         
// default value is UIImagePickerControllerQualityTypeMedium. If the cameraDevice does not support the videoQuality, it will use the default value.
typedef NS_ENUM(NSInteger, UIImagePickerControllerQualityType) {
    UIImagePickerControllerQualityTypeHigh = 0,       // highest quality
    UIImagePickerControllerQualityTypeMedium = 1,     // medium quality, suitable for transmission via Wi-Fi 
    UIImagePickerControllerQualityTypeLow = 2,         // lowest quality, suitable for tranmission via cellular network
    UIImagePickerControllerQualityType640x480 NS_ENUM_AVAILABLE_IOS(4_0) = 3,    // VGA quality
    UIImagePickerControllerQualityTypeIFrame1280x720 NS_ENUM_AVAILABLE_IOS(5_0) = 4,
    UIImagePickerControllerQualityTypeIFrame960x540 NS_ENUM_AVAILABLE_IOS(5_0) = 5,
} __TVOS_PROHIBITED;
  • // 是否顯示相機操作控件
// camera additions available only if sourceType is UIImagePickerControllerSourceTypeCamera.
@property(nonatomic) BOOL showsCameraControls NS_AVAILABLE_IOS(3_1);   
// set to NO to hide all standard camera UI. default is YES
  • // 預覽視圖
@property(nullable, nonatomic,strong) __kindof UIView *cameraOverlayView  NS_AVAILABLE_IOS(3_1);   
// set a view to overlay the preview view.
  • // 預覽視圖的轉換
@property(nonatomic) CGAffineTransform cameraViewTransform NS_AVAILABLE_IOS(3_1);
// set the transform of the preview view.

關于相機設備的屬性

// 相機捕獲類型
@property(nonatomic) UIImagePickerControllerCameraCaptureMode cameraCaptureMode NS_AVAILABLE_IOS(4_0); // default is UIImagePickerControllerCameraCaptureModePhoto
// 相機設備
@property(nonatomic) UIImagePickerControllerCameraDevice      cameraDevice      NS_AVAILABLE_IOS(4_0); // default is UIImagePickerControllerCameraDeviceRear
// 相機閃光類型
@property(nonatomic) UIImagePickerControllerCameraFlashMode   cameraFlashMode   NS_AVAILABLE_IOS(4_0); // default is UIImagePickerControllerCameraFlashModeAuto. 
// cameraFlashMode controls the still-image flash when cameraCaptureMode is Photo. cameraFlashMode controls the video torch when cameraCaptureMode is Video.
typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraCaptureMode) {
    UIImagePickerControllerCameraCaptureModePhoto,
    UIImagePickerControllerCameraCaptureModeVideo
} __TVOS_PROHIBITED;

typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraDevice) {
    UIImagePickerControllerCameraDeviceRear,
    UIImagePickerControllerCameraDeviceFront
} __TVOS_PROHIBITED;

typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraFlashMode) {
    UIImagePickerControllerCameraFlashModeOff  = -1,
    UIImagePickerControllerCameraFlashModeAuto = 0,
    UIImagePickerControllerCameraFlashModeOn   = 1
} __TVOS_PROHIBITED;

方法

  • 類方法
/*是否是可用的讀取源*/ 
+ (BOOL)isSourceTypeAvailable:(UIImagePickerControllerSourceType)sourceType; 
// returns YES if source is available (i.e. camera present)

/*可用的讀取源都有哪些*/
+ (nullable NSArray<NSString *> *)availableMediaTypesForSourceType:(UIImagePickerControllerSourceType)sourceType; 
// returns array of available media types (i.e. kUTTypeImage)

/*相機是否可用*/
+ (BOOL)isCameraDeviceAvailable:(UIImagePickerControllerCameraDevice)cameraDevice                   NS_AVAILABLE_IOS(4_0); 
// returns YES if camera device is available 

/*相機閃光是否可用*/
+ (BOOL)isFlashAvailableForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice           NS_AVAILABLE_IOS(4_0); 
// returns YES if camera device supports flash and torch.

/*可用的捕獲類型都有哪些*/
+ (nullable NSArray<NSNumber *> *)availableCaptureModesForCameraDevice:(UIImagePickerControllerCameraDevice)cameraDevice NS_AVAILABLE_IOS(4_0); 
// returns array of NSNumbers (UIImagePickerControllerCameraCaptureMode)
  • 實例方法
/*開始視頻捕獲*/
-(BOOL)startVideoCapture NS_AVAILABLE_IOS(4_0);

/*停止視頻捕獲*/
-(void)stopVideoCapture  NS_AVAILABLE_IOS(4_0);

代理函數(shù)

@property(nullable,nonatomic,weak) id<UINavigationControllerDelegate, UIImagePickerControllerDelegate> delegate;
@optional
// The picker does not dismiss itself; the client dismisses it in these callbacks.
// The delegate will receive one or the other, but not both, depending whether the user
// confirms or cancels.

/*選擇圖片完成回調(diào)*/
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(nullable NSDictionary<NSString *,id> *)editingInfo NS_DEPRECATED_IOS(2_0, 3_0);

/*選擇圖像完成回調(diào)*/
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info;

/*點擊‘取消’按鈕回調(diào)*/
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker;

回調(diào)函數(shù)中的infoDictionarykey(我們可以通過這些key在回調(diào)函數(shù)的info字典中獲得我們想要的內(nèi)容):

// info dictionary keys
/*圖像類型【NSString】*/
UIKIT_EXTERN NSString *const UIImagePickerControllerMediaType __TVOS_PROHIBITED;      // an NSString (UTI, i.e. kUTTypeImage)
/*原始圖片【UIImage】*/
UIKIT_EXTERN NSString *const UIImagePickerControllerOriginalImage __TVOS_PROHIBITED;  // a UIImage
/*編輯后的圖片【UIImage】*/
UIKIT_EXTERN NSString *const UIImagePickerControllerEditedImage __TVOS_PROHIBITED;    // a UIImage
/*剪裁大小【NSValue(CGRect)】*/
UIKIT_EXTERN NSString *const UIImagePickerControllerCropRect __TVOS_PROHIBITED;       // an NSValue (CGRect)
/*圖像url【NSURL】*/
UIKIT_EXTERN NSString *const UIImagePickerControllerMediaURL __TVOS_PROHIBITED;       // an NSURL
/*相關url【NSURL】*/
UIKIT_EXTERN NSString *const UIImagePickerControllerReferenceURL        NS_AVAILABLE_IOS(4_1) __TVOS_PROHIBITED;  // an NSURL that references an asset in the AssetsLibrary framework
/*媒體元數(shù)據(jù)【NSDictionary】*/
UIKIT_EXTERN NSString *const UIImagePickerControllerMediaMetadata       NS_AVAILABLE_IOS(4_1) __TVOS_PROHIBITED;  // an NSDictionary containing metadata from a captured photo
/*PHLivePhoto類型的數(shù)據(jù),【PHLivePhoto】是iOS9以后添加的一個新的圖片類型,它不僅僅是一張靜態(tài)的圖片,它會抓取拍攝時的聲音和更多幀的圖像*/
UIKIT_EXTERN NSString *const UIImagePickerControllerLivePhoto NS_AVAILABLE_IOS(9_1) __TVOS_PROHIBITED;  // a PHLivePhoto

應用

LMJImageChooseControl是我自己自定義的一個圖片選擇控件,這個控件實現(xiàn)了相冊、相機選擇獲取圖片的功能。
托管地址:https://github.com/MajorLMJ/LMJImageChooseControl
歡迎下載體驗,同時理解UIImagePickerController的使用。

有關相冊、相機的訪問權限

關于相冊、相機的權限請閱讀:iOS訪問相冊、相機權限

版權聲明:出自MajorLMJ技術博客的原創(chuàng)作品 ,轉載時必須注明出處及相應鏈接!

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容