UIImagePickerController
系统提供用来获取图片和或视频的接口,获取图片步奏如下:
- 初始化UIImagePickerController类
- 设置UIImagePickerController实例的数据来源(三种)
typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) { UIImagePickerControllerSourceTypePhotoLibrary, // 图库 UIImagePickerControllerSourceTypeCamera, // 相机 UIImagePickerControllerSourceTypeSavedPhotosAlbum // 相册 } __TVOS_PROHIBITED;
- 设置UIImagePickerController实例的代理
- 设置是否允许编辑图片allowsEditing
- 设置完UIImagePickerController实例属性之后,在需要获取图片时要跳转到图像选取控制器当中去选取或拍摄图片
回调如下
- 完成图片保存到相册后,回调的相关方法,查看是否保存成功
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo { if(error){ [[Toast makeText:LOCALIZATION(@"保存失败")] show]; } else { [[Toast makeText:LOCALIZATION(@"已保存到系统相册")] show]; } }
取消选取调用的方法
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { [self dismissViewControllerAnimated:YES completion:nil]; }
完成图片选取后调用的方法
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info { // 设置不同key值获取不同情况下的图片 UIImage *theSelectImage = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; // 根据字典的key值来选取图片具体如下点 theSelectImage = [UIImage fixOrientation:theSelectImage]; __weak typeof(self)weakSelf = self; [picker dismissViewControllerAnimated:YES completion:^{ }]; }
不同的key值获取到的不同内容(拍照和相册中的info有所不同)
// info dictionary keys // 1、返回的是图片还是视频 UIKIT_EXTERN NSString *const UIImagePickerControllerMediaType __TVOS_PROHIBITED; // an NSString (UTI, i.e. kUTTypeImage) // 通过UIImagePickerControllerMediaType判断返回的是照片还是视频 NSString* type = [info objectForKey:UIImagePickerControllerMediaType]; // 如果返回的type等于kUTTypeImage,代表返回的是照片,并且需要判断当前相机使用的sourcetype是拍照还是相册 if ([type isEqualToString:(NSString*)kUTTypeImage]&&picker.sourceType==UIImagePickerControllerSourceTypeCamera) { } // kUTTypeImage在<MobileCoreServices/MobileCoreServices.h> 下 // 2、获取原图 UIKIT_EXTERN NSString *const UIImagePickerControllerOriginalImage __TVOS_PROHIBITED; // a UIImage // 获取原图 UIImage *original = [info objectForKey:UIImagePickerControllerOriginalImage]; // 3、裁剪框中的图片 UIKIT_EXTERN NSString *const UIImagePickerControllerEditedImage __TVOS_PROHIBITED; // a UIImage // 裁剪框中的图片 UIImage *editedImage = [info objectForKey:UIImagePickerControllerEditedImage]; // 4、裁剪的图片在原图中的CGRect,返回的是NAValue UIKIT_EXTERN NSString *const UIImagePickerControllerCropRect __TVOS_PROHIBITED; // an NSValue (CGRect) // 裁剪的图片在原图中的CGRect,返回的是NAValue CGRect rect = [[info objectForKey:UIImagePickerControllerCropRect] CGRectValue]; CGRectValue在#import <Foundation/Foundation.h>下 // 5、获取图片的url UIKIT_EXTERN NSString *const UIImagePickerControllerMediaURL __TVOS_PROHIBITED; // an NSURL // 获取图片的url NSURL* url = [info objectForKey:UIImagePickerControllerMediaURL]; // 6、还不知道 UIKIT_EXTERN NSString *const UIImagePickerControllerReferenceURL NS_AVAILABLE_IOS(4_1) __TVOS_PROHIBITED; // an NSURL that references an asset in the AssetsLibrary framework // NSURL* url = [info UIImagePickerControllerReferenceURL]; // 7、返回拍照图片的内容,返回的是字典(相册中获取的没有) UIKIT_EXTERN NSString *const UIImagePickerControllerMediaMetadata NS_AVAILABLE_IOS(4_1) __TVOS_PROHIBITED; // an NSDictionary containing metadata from a captured photo // 图片的数据(返回的是字典)只有照相的dic有内容,相册为dic = nil NSDictionary *dic = [info objectForKey:UIImagePickerControllerMediaMetadata]; // 8、还不知道 UIKIT_EXTERN NSString *const UIImagePickerControllerLivePhoto NS_AVAILABLE_IOS(9_1) __TVOS_PROHIBITED; // a PHLivePhoto
代码如下
// 打开图库
- (void)photoButtonAction:(UIButton *)button {
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
// 设置UIImagePickerController实例的数据来源为图库
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
// 设置代理
picker.delegate = self;
//设置选择后的图片不可编辑
picker.allowsEditing = NO;
[self presentViewController:picker animated:YES completion:^{
}];
}
// 打开相机,要注意判断是否支持相机
- (void)takePhotoButtonAction:(UIButton *)button {
UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera; // 设置UIImagePickerController实例的数据来源为相机
// 判断是否支持相机
if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) {
// 实例化
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
// 设置代理
picker.delegate = self;
//设置拍照后的图片可被编辑
picker.allowsEditing = YES;
picker.sourceType = sourceType;
[self presentViewController:picker animated:YES completion:^{
}];
} else {
NSLog(@"模拟器其中无法打开照相机,请在真机中使用");
}
}
// 保存图片到本地
- (void)saveButtonAction:(ScannerSmallImageButton *)button {
// 图片存入本地(回调方法格式固定)
UIImageWriteToSavedPhotosAlbum(theNeedSaveImage, self(指pickControl的代理), @selector(image:didFinishSavingWithError:contextInfo:), NULL);
}
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {
if(error) {
[[Toast makeText:LOCALIZATION(@"保存失败")] show];
} else {
[[Toast makeText:LOCALIZATION(@"已保存到系统相册")] show];
}
}
判断设备是否支持数据源
typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {
UIImagePickerControllerSourceTypePhotoLibrary, // 图库
UIImagePickerControllerSourceTypeCamera, // 相机
UIImagePickerControllerSourceTypeSavedPhotosAlbum // 相册
} __TVOS_PROHIBITED;
// 判断是否支持相机,在打开相机时需要进行判断
if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) {
}
// 判断是否支持图库
if( [UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypePhotoLibrary]) {
}
// 判断是否支持相册
if( [UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeSavedPhotosAlbum]) {
}
// 设置数据源
pickerController.sourceType = UIImagePickerControllerSourceType;
判断设备是否支持前、后摄像头
typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraDevice) {
UIImagePickerControllerCameraDeviceRear, // 后摄像头
UIImagePickerControllerCameraDeviceFront // 前摄像头
} __TVOS_PROHIBITED;
// 判断是否支持前摄像头
if([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear]) {
}
// 判断是否支持后摄像头
if([UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]) {
}
// 设置前摄像头
pickerController.cameraDevice = UIImagePickerControllerCameraDeviceFront;
// 设置后摄像头
pickerController.cameraDevice = UIImagePickerControllerCameraDeviceRear;
返回前摄像头/后摄像头拍摄的类型
// 摄像头类型
typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraDevice) {
UIImagePickerControllerCameraDeviceRear, // 后摄像头闪光灯
UIImagePickerControllerCameraDeviceFront // 前摄像头闪光灯
} __TVOS_PROHIBITED;
// 返回类型
typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraCaptureMode) {
UIImagePickerControllerCameraCaptureModePhoto, // 照片
UIImagePickerControllerCameraCaptureModeVideo // 视频
} __TVOS_PROHIBITED;
判断设备是否支持前摄像头闪光灯、后摄像头闪光灯
只要相机设备支持闪光灯和手电就会返回YES
typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraDevice) {
UIImagePickerControllerCameraDeviceRear, // 后摄像头闪光灯
UIImagePickerControllerCameraDeviceFront // 前摄像头闪光灯
} __TVOS_PROHIBITED;
typedef NS_ENUM(NSInteger, UIImagePickerControllerCameraFlashMode) {
UIImagePickerControllerCameraFlashModeOff = -1, // 关
UIImagePickerControllerCameraFlashModeAuto = 0, // 自动
UIImagePickerControllerCameraFlashModeOn = 1 // 开
} __TVOS_PROHIBITED;
// 要相机设备支持闪光灯和手电就会返回YES
// 判断是否支持前摄像头闪光灯
if([UIImagePickerController isFlashAvailableForCameraDevice:UIImagePickerControllerCameraDeviceRear]) {
}
// 判断是否支持后摄像头闪光灯
if([UIImagePickerController isFlashAvailableForCameraDevice:UIImagePickerControllerCameraDeviceFront]) {
}
// 设置闪光灯的情况,在拍照的时候才会闪
// 不开闪光灯
picker.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff;
// 暗的时候自动开启,亮的时候不开启
picker.cameraFlashMode = UIImagePickerControllerCameraFlashModeAuto;
// 开
picker.cameraFlashMode = UIImagePickerControllerCameraFlashModeOn;