iOS-系统 图片、视频 管理控制器UIImagePickerController
UIImagePickerController 是一个管理系统多媒体文件库(相册)中的图片、视频文件的视图控制器,诞生于iOS4之前,虽然功能不是很完善,我们仍可以用这个视图控制器做一些有创造性的开发,接下来会对其的常见和主要的使用逐个介绍。
首先 贴上一张图,帮助我们了解UIImagePickerController的整个构成,以及相关API被设计出来的用途:
UIImagePickerController管理用户在使用相机或者相簿时的交互,并且将交互产生的图片、视频文件传送给其delegate对象。交互产生的文件类型是图片还是视频取决于对使用其进行交互前对资源类型的设置,我们可以通过设置 UIImagePickerControllerSourceType的值来决定。详情参考官方文档的描述:
A
sourceType
ofUIImagePickerControllerSourceTypeCamera
provides a user interface for taking a new picture or movie (on devices that support media capture).A
sourceType
ofUIImagePickerControllerSourceTypePhotoLibrary
orUIImagePickerControllerSourceTypeSavedPhotosAlbum
provides a user interface for choosing among saved pictures and movies.
UIImagePickerControllerSourceType是一个枚举选项,如下
typedef enum UIImagePickerControllerSourceType : NSInteger {
UIImagePickerControllerSourceTypePhotoLibrary,
UIImagePickerControllerSourceTypeCamera,
UIImagePickerControllerSourceTypeSavedPhotosAlbum
} UIImagePickerControllerSourceType;
对其相关描述如下:
UIImagePickerControllerSourceTypePhotoLibrary
Specifies the device’s photo library as the source for the image picker controller.
使用相册 作为 image picker controller的资源文件打开
UIImagePickerControllerSourceTypeCamera
Specifies the device’s built-in camera as the source for the image picker controller. Indicate the specific camera you want (front or rear, as available) by using the cameraDevice
property.
使用摄像头进行操作 获取资源文件
UIImagePickerControllerSourceTypeSavedPhotosAlbum
Specifies the device’s Camera Roll album as the source for the image picker controller. If the device does not have a camera, specifies the Saved Photos album as the source
使用通过摄像头处理得到的资源文件作为展示对象,若设备不支持摄像头,则使用用户通过其他途径获取到的文件作为展示对象。
在使用UIImagePickerController操作时,我们不仅要设置sourceType,还可以设置allowsEdicting、allowImageEditing等属性。
//UIImagePickerController常见用途
1. 调用摄像头拍照
2. 从相册中选择
3. 从图库中选择
UIImagePickerController 是系统提供的用来获取图片和视频的接口;
用UIImagePickerController 类来获取图片视频,大体分为以下几个步骤:
1. 初始化UIImagePickerController 类;
2. 设置UIImagePickerController 实例的数据来源类型(下面解释);
3. 设置设置代理;
4. 如果需要做图片修改的话设置allowsEditing =yes。
数据来源类型一共有三种:
- enum {
- UIImagePickerControllerSourceTypePhotoLibrary ,//来自图库
- UIImagePickerControllerSourceTypeCamera ,//来自相机
- UIImagePickerControllerSourceTypeSavedPhotosAlbum //来自相册
- };
在用这些来源的时候最好检测以下设备是否支持;
- if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
- {
- NSLog(@"支持相机");
- }
- if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])
- {
- NSLog(@"支持图库");
- }
- if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])
- {
- NSLog(@"支持相片库");
- }
调用摄像头来获取资源
- - (void)viewDidLoad {
- [super viewDidLoad];
- picker = [[UIImagePickerController alloc]init];
- picker.view.backgroundColor = [UIColor orangeColor];
- UIImagePickerControllerSourceType sourcheType = UIImagePickerControllerSourceTypeCamera;
- picker.sourceType = sourcheType;
- picker.delegate = self;
- picker.allowsEditing = YES;
- }
上面只是实例了UIImagePickerController及其属性 在需要获取图片的时候需要弹出窗口调用
- [self presentViewController:picker animated:YES completion:nil];
我们还需要代理来获取我们选中的图片
- UIImagePickerControllerDelegate
代理中一共三个方法 其中一个3.0 已经废弃了,只剩下两个我们需要用的
- - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary
- *)info;
当用户选取完成后调用;
- - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker;
当用户取消选取时调用;
- - (void)imagePickerController:(UIImagePickerController *)picker
- didFinishPickingMediaWithInfo:(NSDictionary *)info;
选取的信息都在info中,info 是一个字典。
字典中的键:
- NSString *const UIImagePickerControllerMediaType ;指定用户选择的媒体类型(文章最后进行扩展)
- NSString *const UIImagePickerControllerOriginalImage ;原始图片
- NSString *const UIImagePickerControllerEditedImage ;修改后的图片
- NSString *const UIImagePickerControllerCropRect ;裁剪尺寸
- NSString *const UIImagePickerControllerMediaURL ;媒体的URL
- NSString *const UIImagePickerControllerReferenceURL ;原件的URL
- NSString *const UIImagePickerControllerMediaMetadata;当来数据来源是照相机的时候这个值才有效
UIImagePickerController 的更多参数参考这里。
代理中的功能参考这里。
UIImagePickerControllerMediaType 包含着KUTTypeImage 和KUTTypeMovie
KUTTypeImage 包含:
- const CFStringRef kUTTypeImage ;抽象的图片类型
- const CFStringRef kUTTypeJPEG ;
- const CFStringRef kUTTypeJPEG2000 ;
- const CFStringRef kUTTypeTIFF ;
- const CFStringRef kUTTypePICT ;
- const CFStringRef kUTTypeGIF ;
- const CFStringRef kUTTypePNG ;
- const CFStringRef kUTTypeQuickTimeImage ;
- const CFStringRef kUTTypeAppleICNS
- const CFStringRef kUTTypeBMP;
- const CFStringRef kUTTypeICO;
KUTTypeMovie 包含:
- const CFStringRef kUTTypeAudiovisualContent ;抽象的声音视频
- const CFStringRef kUTTypeMovie ;抽象的媒体格式(声音和视频)
- const CFStringRef kUTTypeVideo ;只有视频没有声音
- const CFStringRef kUTTypeAudio ;只有声音没有视频
- const CFStringRef kUTTypeQuickTimeMovie ;
- const CFStringRef kUTTypeMPEG ;
- const CFStringRef kUTTypeMPEG4 ;
- const CFStringRef kUTTypeMP3 ;
- const CFStringRef kUTTypeMPEG4Audio ;
- const CFStringRef kUTTypeAppleProtectedMPEG4Audio
使用UIImagePickerController工作的步骤如下:
//
// ViewController.h
// 相机Demo
//
// Created by gzlx on 2018/9/18.
// Copyright © 2018年 VanZhang. All rights reserved.
//
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@end
//
// ViewController.m
// 相机Demo
//
// Created by gzlx on 2018/9/18.
// Copyright © 2018年 VanZhang. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()<UINavigationControllerDelegate,UIImagePickerControllerDelegate,UIActionSheetDelegate>
@end
@implementation ViewController
-(UIInterfaceOrientationMask)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskAllButUpsideDown;
}
- (void)viewDidLoad{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (IBAction)takePictureButtonClick:(id)sender{
//检查相机模式是否可用
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
NSLog(@"sorry, no camera or camera is unavailable.");
return;
}
//获得相机模式下支持的媒体类型
NSArray* availableMediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
BOOL canTakePicture = NO;
for (NSString* mediaType in availableMediaTypes) {
if ([mediaType isEqualToString:(NSString*)kUTTypeImage]) {
//支持拍照
canTakePicture = YES;
break;
}
}
//检查是否支持拍照
if (!canTakePicture) {
NSLog(@"sorry, taking picture is not supported.");
return;
}
//创建图像选取控制器
UIImagePickerController* imagePickerController = [[UIImagePickerController alloc] init];
//设置图像选取控制器的来源模式为相机模式
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
//设置图像选取控制器的类型为静态图像
imagePickerController.mediaTypes = [[NSArray alloc] initWithObjects:(NSString*)kUTTypeImage, nil];
//允许用户进行编辑
imagePickerController.allowsEditing = YES;
//设置委托对象
imagePickerController.delegate = self;
//以模视图控制器的形式显示
[self presentViewController:imagePickerController animated:YES completion:NULL];
}
- (IBAction)captureVideoButtonClick:(id)sender{
//检查相机模式是否可用
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
NSLog(@"sorry, no camera or camera is unavailable!!!");
return;
}
//获得相机模式下支持的媒体类型
NSArray* availableMediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
BOOL canTakeVideo = NO;
for (NSString* mediaType in availableMediaTypes) {
if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]) {
//支持摄像
canTakeVideo = YES;
break;
}
}
//检查是否支持摄像
if (!canTakeVideo) {
NSLog(@"sorry, capturing video is not supported.!!!");
return;
}
//创建图像选取控制器
UIImagePickerController* imagePickerController = [[UIImagePickerController alloc] init];
//设置图像选取控制器的来源模式为相机模式
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
//设置图像选取控制器的类型为动态图像
imagePickerController.mediaTypes = [[NSArray alloc] initWithObjects:(NSString*)kUTTypeMovie, nil];
//设置摄像图像品质
imagePickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;
//设置最长摄像时间
imagePickerController.videoMaximumDuration = 30;
//允许用户进行编辑
imagePickerController.allowsEditing = YES;
//设置委托对象
imagePickerController.delegate = self;
//以模式视图控制器的形式显示
[self presentViewController:imagePickerController animated:YES completion:NULL];
}
- (void)image:(UIImage*)image didFinishSavingWithError:(NSError*)error contextInfo:(void*)contextInfo{
if (!error) {
NSLog(@"picture saved with no error.");
}
else{
NSLog(@"error occured while saving the picture%@", error);
}
}
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{
//打印出字典中的内容
NSLog(@"get the media info: %@", info);
//获取媒体类型
NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType];
//判断是静态图像还是视频
if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {
//获取用户编辑之后的图像
UIImage* editedImage = [info objectForKey:UIImagePickerControllerEditedImage];
//将该图像保存到媒体库中
UIImageWriteToSavedPhotosAlbum(editedImage, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
}else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]){
//获取视频文件的url
NSURL* mediaURL = [info objectForKey:UIImagePickerControllerMediaURL];
//创建ALAssetsLibrary对象并将视频保存到媒体库
ALAssetsLibrary* assetsLibrary = [[ALAssetsLibrary alloc] init];
[assetsLibrary writeVideoAtPathToSavedPhotosAlbum:mediaURL completionBlock:^(NSURL *assetURL, NSError *error) {
if (!error) {
NSLog(@"captured video saved with no error.");
}else
{
NSLog(@"error occured while saving the video:%@", error);
}
}];
}
[picker dismissViewControllerAnimated:YES completion:NULL];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
[picker dismissViewControllerAnimated:YES completion:NULL];
}}
@end
最后附上本文的实战demo 供参考 ,若是在运行中发生任何问题,都可以联系我.
iOS-系统 图片、视频 管理控制器UIImagePickerController的更多相关文章
- 超强教程:如何搭建一个 iOS 系统的视频直播 App?
现今,直播市场热火朝天,不少人喜欢在手机端安装各类直播 App,便于随时随地观看直播或者自己当主播.作为开发者来说,搭建一个稳定性强.延迟率低.可用性强的直播平台,需要考虑到部署视频源.搭建聊天室.优 ...
- 苹果系统iOS、macOS应用管理机制
iOS.macOS系统应用管理机制 苹果系统包括:iOS.macOS.watchOS.tvOS.应用软件的生命周期为:开发.上线.安装.使用.卸载.这篇文档将从应用生命周期的各个环节介绍苹果系统对应用 ...
- iOS - Photo Album 图片/相册管理
前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIImagePickerController : UINavigationController <NSCod ...
- ios 上传视频或图片
关于iOS如何实现视频和图片的上传, 我们先理清下思路 思路: #1. 如何获取图片? #2. 如何获取视频? #3. 如何把图片存到缓存路径中? #4. 如何把视频存到缓存路径中? #5. 如何上传 ...
- iOS:图像选取器控制器控件UIImagePickerController的详解
图像选择控制器:UIImagePickerController 功能:用于选取相册或相机等里面的照片. @interface UIImagePickerController : UINavigatio ...
- 社交网络编程API之iOS系统自带分享
社交网络编程API 社交网络编程主要使用iOS提供的Social框架,目前Social框架主要包含两个类: SLComposeViewController 提供撰写社交信息(如微博信息)的视图控制器, ...
- iOS开发系列- 视频MPMoviePlayerController
MPMoviePlayerController 在iOS中播放视频可以使用MediaPlayer.framework种的MPMoviePlayerController类来完成,它支持本地视频和网络视频 ...
- Android IOS WebRTC 音视频开发总结(八十五)-- 使用WebRTC广播网络摄像头视频(下)
本文主要介绍WebRTC (我们翻译和整理的,译者:weizhenwei,校验:blacker),最早发表在[编风网] 支持原创,转载必须注明出处,欢迎关注我的微信公众号blacker(微信ID:bl ...
- iOS系统相册的有关操作
iOS中,我们选择相册中的资源和调用摄像头可以使用 :UIImagePickerController类来完成,不使用UI我们可以通过:ALAssetsLibrary类来使用相册资源. 一. ALAss ...
随机推荐
- AngularJS-Learning ui-router angular-transitions
https://github.com/mgechev/AngularJS-Learning https://github.com/angular-ui/ui-router https://github ...
- Java中syso的封装
将syso设置为由开关切换确实是个很不错的思想,这样就不用傻傻的一个个去找不用的syso进行删除或者注释 当然了,由网友所说,这叫日志系统情何以堪,这里想说的是这个开关的思想值得我这小白学习 此为看 ...
- C#正则表达式提取HTML中IMG标签的SRC地址(转)
一般来说一个 HTML 文档有很多标签,比如“<html>”.“<body>”.“<table>”等,想把文档中的 img 标签提取出来并不是一件容易的事.由于 i ...
- Fat Jar - Myeclipse插件安装使用方法- 完美解决
Eclipse可以安装一个叫Fat Jar的插件,用这个插件打包非常方便,Fat Jar的功能非常强大. 工具/原料 Eclipse Kepler Fat Jar 方法/步骤 1 Fat Jar功能非 ...
- Selenium自动化测试基础
如有任何学习问题,可以添加作者微信:lockingfree 目录 Selenium自动化测试基础 Selenium自动化测试第一天(上) Selenium自动化测试第一天(下) Selenium自动化 ...
- Linux命令应用大词典-第34章 打印与传真
34.1 lpr:打印文件 34.2 lpq:显示打印队列状态 34.3 lprm:取消打印作业 34.4 lpstat:显示cups状态信息 34.5 cupsaccept:接受作业发送到目的地 3 ...
- Java开发工程师(Web方向) - 02.Servlet技术 - 第2章.Cookie与Session
第2章--Cookie与Session Cookie与Session 浏览器输入地址--HTTP请求--Servlet--HTTP响应--浏览器接收 会话(session):打开浏览器,打开一系列页面 ...
- TW实习日记:第16天
前端的样式bug实在是太太太莫名其妙了,尤其是封装好的组件,一层套一层的,根本不知道是哪一层出了问题...除了改bug就是做新功能,真想吐槽一下这个项目的留言板,根本没人会用吧...这功能实在是太老旧 ...
- 配置vConsole调试console
1.使用 npm 安装: npm install vconsole 再使用webpack,然后js代码中 import VConsole from 'vconsole/dist/vconsole.mi ...
- linux 命令行基础
命令行基础 一些名词 「图形界面」 「命令行」 「终端」 「shell」 「bash」 安装使用 Windws: 安装git, 打开 gitbash Linux 打开终端 Mac 打开终端 基本命令 ...