//
// ViewController.m
// 相机
//
// Created by yeyuanxiang on 16/5/12.
// Copyright © 2016年 KuYu_YX. All rights reserved.
//
#import "ViewController.h"
#import <MobileCoreServices/MobileCoreServices.h>
#import <AVFoundation/AVFoundation.h>
//UIImagePickerController的代理需要遵守这两个协议.<UIImagePickerControllerDelegate, UINavigationControllerDelegate>
@interface ViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate>
@property (assign,nonatomic) int isVideo;//是否录制视频,如果为1表示录制视频,0代表拍照
@property (strong,nonatomic) UIImagePickerController *imagePicker;
@property (strong, nonatomic) UIImageView *imageView;//照片展示视图
@property (strong,nonatomic) AVPlayer *player;//播放器,用于录制完视频后播放视频
@property (strong,nonatomic) UISegmentedControl *segment ; //1表示录制视频,0代表拍照
@end
@implementation ViewController
-(UIImageView *)imageView
{
if (_imageView == nil) {
self.imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 290, self.view.bounds.size.width, self.view.bounds.size.height - 380)];
self.imageView.backgroundColor = [UIColor clearColor];
[self.view addSubview:_imageView];
}
return _imageView ;
}
#pragma mark - 控制器视图事件
- (void)viewDidLoad {
[super viewDidLoad];
//UIImagePickerController静态方法判断设备是否支持照相机/图片库/相册功能
/*
typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {
UIImagePickerControllerSourceTypePhotoLibrary, //照片库(通过同步存放的,用户不能删除)
UIImagePickerControllerSourceTypeCamera, //照相机
UIImagePickerControllerSourceTypeSavedPhotosAlbum //保存的照片(通过拍照或者截屏保存的,用户可以删除)
};
*/
[self initButton];
}
/*
//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;
*/
#pragma mark - 私有方法
-(UIImagePickerController *)imagePicker{
if (!_imagePicker) {
_imagePicker=[[UIImagePickerController alloc]init];
_imagePicker.sourceType=UIImagePickerControllerSourceTypeCamera;//设置image picker的来源,这里设置为摄像头
_imagePicker.cameraDevice=UIImagePickerControllerCameraDeviceRear;//设置使用哪个摄像头,这里设置为后置摄像头
if (self.isVideo) {
_imagePicker.mediaTypes=@[(NSString *)kUTTypeMovie];
_imagePicker.videoQuality=UIImagePickerControllerQualityTypeIFrame1280x720;
_imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModeVideo;//设置摄像头模式(拍照,录制视频)
}else{
_imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModePhoto;
}
_imagePicker.allowsEditing=YES;//允许编辑
_imagePicker.delegate=self;//设置代理,检测操作
}
return _imagePicker;
}
-(void)initButton
{
self.isVideo = NO ;
self.segment = [[UISegmentedControl alloc] initWithItems:@[@"拍照",@"录制"]];
_segment.frame = CGRectMake(0, self.view.bounds.size.height - 40, self.view.bounds.size.width, 40) ;
_segment.selectedSegmentIndex = 0 ;
[_segment addTarget:self action:@selector(segmentAction:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:_segment];
__weak typeof(self) weakify = self ;
void (^block)(UIButton *, NSString *, UIColor *) = ^(UIButton *button, NSString *string,UIColor *color){
button.backgroundColor = color ;
button.layer.cornerRadius = 7 ;
[button setTitle:string forState:UIControlStateNormal];
[weakify.view addSubview:button];
};
NSArray *array = @[@"图库",@"拍照",@"相册"];
for (int i = 1; i < 4; i++) {
UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
button.tag = i ;
button.frame = CGRectMake(100, 50 + (i-1) * 20 + (i-1) * 60 , 175, 60) ;
NSString *string = array[i-1] ;
block(button,string,[UIColor redColor]);
}
UIButton *button1 = [self.view viewWithTag:1];
UIButton *button2 = [self.view viewWithTag:2];
UIButton *button3 = [self.view viewWithTag:3];
[button1 addTarget:self action:@selector(takeClick1) forControlEvents:UIControlEventTouchUpInside];
[button2 addTarget:self action:@selector(takeClick2) forControlEvents:UIControlEventTouchUpInside];
[button3 addTarget:self action:@selector(takeClick3) forControlEvents:UIControlEventTouchUpInside];
}
#pragma mark --
-(void)segmentAction:(UISegmentedControl *)segment
{
NSInteger index = segment.selectedSegmentIndex ;
NSLog(@"%ld",index);
switch (index) {
case 0:{
self.isVideo = NO ;
UIButton *button1 = [self.view viewWithTag:1];
UIButton *button2 = [self.view viewWithTag:2];
UIButton *button3 = [self.view viewWithTag:3];
button1.hidden = NO ;
button2.hidden = NO ;
button3.hidden = NO ;
self.imageView.frame = CGRectMake(0, 290, self.view.bounds.size.width, self.view.bounds.size.height - 380);
}
break;
case 1:{
self.isVideo = YES ;
UIButton *button1 = [self.view viewWithTag:1];
UIButton *button2 = [self.view viewWithTag:2];
UIButton *button3 = [self.view viewWithTag:3];
button1.hidden = YES ;
button2.hidden = YES ;
button3.hidden = YES ;
self.imageView.frame = CGRectMake(0, 0, self.view.bounds.size.width,self.view.bounds.size.height -40) ;
_imagePicker.mediaTypes=@[(NSString *)kUTTypeMovie];
_imagePicker.videoQuality=UIImagePickerControllerQualityTypeIFrame1280x720;
_imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModeVideo;//设置摄像头模式(拍照,录制视频)
[self presentViewController:self.imagePicker animated:YES completion:nil];
}
break;
default:
break;
}
}
#pragma mark - UI事件
//点击拍照按钮
- (void)takeClick1 {
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])
{
NSLog(@"支持图库");
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary ;
picker.delegate = self ;
picker.allowsEditing = YES ;
[self presentViewController:picker animated:YES completion:nil];
}
else
{
NSLog(@"图库不可用");
}
}
-(void)takeClick2{
if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
NSLog(@"支持相机");
self.imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera ;
_imagePicker.mediaTypes=@[(NSString *)kUTTypeImage];
_imagePicker.cameraCaptureMode=UIImagePickerControllerCameraCaptureModePhoto ;
[self presentViewController:self.imagePicker animated:YES completion:nil];
}
else
{
NSLog(@"相机不可用");
}
}
-(void)takeClick3{
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])
{
NSLog(@"支持相片库");
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum ;
picker.delegate = self ;
picker.allowsEditing = YES ;
[self presentViewController:picker animated:YES completion:nil];
}
else
{
NSLog(@"相片库不可用");
}
}
//字典中的键:
/*
NSString *const UIImagePickerControllerMediaType ;指定用户选择的媒体类型(文章最后进行扩展)
NSString *const UIImagePickerControllerOriginalImage ;原始图片
NSString *const UIImagePickerControllerEditedImage ;修改后的图片
NSString *const UIImagePickerControllerCropRect ;裁剪尺寸
NSString *const UIImagePickerControllerMediaURL ;媒体的URL
NSString *const UIImagePickerControllerReferenceURL ;原件的URL
NSString *const UIImagePickerControllerMediaMetadata;当来数据来源是照相机的时候这个值才有效
*/
#pragma mark - imagePicker代理方法
//当用户取消选取时调用
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker{
NSLog(@"取消");
[self dismissViewControllerAnimated:YES completion:nil];
}
//当用户选取完成后调用
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
NSString *mediaType=[info objectForKey:UIImagePickerControllerMediaType];
if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {//如果是拍照
NSLog(@"相机、图库、相册......模式");
[self isPicker:picker MediaWithInfo:info];
// 关闭照片选择器
[self dismissViewControllerAnimated:YES completion:nil];
}
else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie]){//如果是录制视频
NSLog(@"录制视屏模式");
NSURL *url=[info objectForKey:UIImagePickerControllerMediaURL];//视频路径
NSString *urlStr=[url path];
if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(urlStr)) {
//保存视频到相簿,注意也可以使用ALAssetsLibrary来保存
UISaveVideoAtPathToSavedPhotosAlbum(urlStr, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);//保存视频到相簿
}
}
NSLog(@"完成");
}
//视频保存后的回调
- (void)video:(NSString *)videoPath didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo{
if (error) {
NSLog(@"保存视频过程中发生错误,错误信息:%@",error.localizedDescription);
}else{
NSLog(@"视频保存成功.");
//录制完之后自动播放
NSURL *url=[NSURL fileURLWithPath:videoPath];
_player=[AVPlayer playerWithURL:url];
AVPlayerLayer *playerLayer=[AVPlayerLayer playerLayerWithPlayer:_player];
playerLayer.frame=self.imageView.frame;
[self.imageView.layer addSublayer:playerLayer];
[_player play];
}
}
-(void)isPicker:(UIImagePickerController *)picker MediaWithInfo:(NSDictionary *)info
{
UIImage *image = [self chooseSelectorPicker:picker MediaWithInfo:info];
self.imageView.image = image ;
if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
// 需要将照片保存至应用程序沙箱,由于涉及到数据存储,同时与界面无关
// 可以使用多线程来保存图像
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 保存图像
// 1. 取图像路径
NSArray *docs = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *imagePath = [docs[0]stringByAppendingPathComponent:@"11.png"];
NSLog(@"imagePath = %@",imagePath);
// 2. 转换成NSData保存
NSData *imageData = UIImagePNGRepresentation(image);
[imageData writeToFile:imagePath atomically:YES];
});
//UIKIT_EXTERN void UIImageWriteToSavedPhotosAlbum(UIImage *image, __nullable id completionTarget, __nullable SEL completionSelector, void * __nullable contextInfo) __TVOS_PROHIBITED;
//将照片写进相册
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) ;
}
}
//判断否编辑去图片
-(UIImage *)chooseSelectorPicker:(UIImagePickerController *)picker MediaWithInfo:(NSDictionary *)info
{
UIImage *image;
//如果允许编辑则获得编辑后的照片,否则获取原始照片
if (picker.allowsEditing) {
image=[info objectForKey:UIImagePickerControllerEditedImage];//获取编辑后的照片
}else{
image=[info objectForKey:UIImagePickerControllerOriginalImage];//获取原始照片
}
return image ;
}
@end
UIImagePickerController的简单应用
最新推荐文章于 2024-08-02 16:52:11 发布