iOS 录制图片视频的三种方法(一) UIImagePickerController 拍照

268 阅读2分钟

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];