iOS 图片视频录制三种方法之 UIImagePickerController
UIImagePickerController 拍照
- 先导入如下库, MobileCoreServices 是需要用到的类型常量 ,Photos是保存到相册用到的
#import <MobileCoreServices/MobileCoreServices.h>
#import <Photos/Photos.h>
- 权限描述
Privacy - Camera Usage Description
Privacy - Photo Library Usage Description
检查相机是否可用
-(void)isCamerAvailable
{
BOOL isAvailable = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
if (isAvailable) {
NSLog(@"相机可用");
} else {
NSLog(@"相机不可用");
}
}
- 检查摄像头是否可用
-(void)isCameraDeviceFrontAvailable
{
/*
UIImagePickerControllerCameraDeviceRear 后置摄像头
UIImagePickerControllerCameraDeviceFront 前置摄像头
*/
BOOL isAvailable = [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront];
if (isAvailable) {
NSLog(@"摄像头可用");
} else {
NSLog(@"摄像头不可用");
}
}
- 检查灯光是否可用
-(void)isFlashAvailable
{
BOOL isAvailable = [UIImagePickerController isFlashAvailableForCameraDevice:UIImagePickerControllerCameraDeviceRear];
if (isAvailable) {
NSLog(@"闪光灯可用");
} else {
NSLog(@"闪光灯不可用");
}
}
- 支持媒体类型
-(void)cameraSupportedMedia
{
NSArray<NSString *> *mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
for (NSString *type in mediaTypes) {
NSLog(@"支持媒体类型 - %@",type);
}
}
- 配置 UIImagePickerController 拍照
UIImagePickerController *imagePickerVC = [[UIImagePickerController alloc] init];
imagePickerVC.sourceType = UIImagePickerControllerSourceTypeCamera;
/*
* 支持媒体类型
* kUTTypeImage 照片
* kUTTypeVideo 视频
*/
imagePickerVC.mediaTypes = @[(__bridge NSString *)kUTTypeImage];
imagePickerVC.allowsEditing = YES;
imagePickerVC.delegate = self;
imagePickerVC.cameraFlashMode = UIImagePickerControllerCameraFlashModeOn; // 开启闪光灯
imagePickerVC.cameraDevice = UIImagePickerControllerCameraDeviceRear; // 后置摄像头
[self presentViewController:imagePickerVC animated:YES completion:NULL];
- UIImagePickerController 代理方法 - UIImagePickerControllerDelegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey, id> *)info
{
NSLog(@"info: -%@",info);
NSString *mediaType = [info objectForKey:UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:(__bridge NSString *)kUTTypeImage]) { // 照片
UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
} else if ([mediaType isEqualToString:(__bridge NSString *)kUTTypeVideo]) { // 视频
NSLog(@"%@",[info objectForKey:UIImagePickerControllerMediaURL]);
}
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
[picker dismissViewControllerAnimated:YES completion:NULL];
}
保存到相册
- 检查相册权限
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusAuthorized) {
NSLog(@"有权限");
} else {
NSLog(@"没有相册访问权限");
}
}];
- 保存到相册
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
[PHAssetChangeRequest creationRequestForAssetFromImage:image];
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (success == NO) {
NSLog(@"保存图片出错 - %@",error.localizedDescription);
} else {
NSLog(@"成功保存图片");
}
}];
- 图片保存到沙盒
NSString *documentDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *imageDirectoryPath = [documentDirectory stringByAppendingPathComponent:@"/Image"];
BOOL isDirectory;
BOOL isExitDirectory = [[NSFileManager defaultManager] fileExistsAtPath:imageDirectoryPath isDirectory:&isDirectory]; // 创建目录
NSString *imagePath = [imageDirectory stringByAppendingPathComponent:@"/test.png"];
BOOL result = [[NSFileManager defaultManager] createDirectoryAtPath:imageDirectoryPath withIntermediateDirectories:YES attributes:nil error:nil]; // 创建文件
BOOL result = [UIImagePNGRepresentation(image) writeToFile:imagePath atomically:NO];
if (result) {
NSLog(@"保存成功");
} else {
NSLog(@"保存失败");
}
- 由于保存到沙盒的图片会旋转因此要做一下处理, 如下才能获取正常的图片
UIImage *image = [UIImage imageWithContentsOfFile:imagePath];
UIImage *resultImage = [UIImage imageWithCGImage:image.CGImage scale:image.scale orientation:UIImageOrientationRight];