iOS 圖片來源有三種方法:
typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) {
UIImagePickerControllerSourceTypePhotoLibrary, //1.從圖庫中選擇
UIImagePickerControllerSourceTypeCamera, //2.直接調用攝像頭拍照
UIImagePickerControllerSourceTypeSavedPhotosAlbum //3.從相冊中選擇
} __TVOS_PROHIBITED;
UIImagePickerController是系統提供的用來獲取圖片和視頻的接口,用UIImagePickerController類來獲取圖片視頻,大體分為以下幾個步驟:
1. 實例化UIImagePickerController
2. 設置UIImagePickerController數據來源類型
3. 設置代理,遵循UIImagePickerControllerDelegate,UINavigationControllerDelegate協議
4. 實現代理方法接收選取圖片并做處理
在代理中獲取我們選中的圖片,UIImagePickerControllerDelegate代理中一共三個方法,其中一個3.0已經廢棄了,只剩下兩個我們需要用的。
//1.當用戶選取完成后調用;
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info;
//2.當用戶取消選取時調用;
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker;
在這里,我們主要使用第一個代理方法,在選取圖片完成后調用,選取的信息都在info中,info 是一個字典。
// 代理方法,獲取圖片
// 選取的信息都在info中,info 是一個字典。
/**
// info dictionary keys
UIKIT_EXTERN NSString *const UIImagePickerControllerMediaType __TVOS_PROHIBITED;//指定用戶選擇的媒體類型
UIKIT_EXTERN NSString *const UIImagePickerControllerOriginalImage __TVOS_PROHIBITED;//原始圖片
UIKIT_EXTERN NSString *const UIImagePickerControllerEditedImage __TVOS_PROHIBITED;//修改后的圖片
UIKIT_EXTERN NSString *const UIImagePickerControllerCropRect __TVOS_PROHIBITED;//裁剪尺寸
UIKIT_EXTERN NSString *const UIImagePickerControllerMediaURL __TVOS_PROHIBITED;//媒體的URL
UIKIT_EXTERN NSString *const UIImagePickerControllerReferenceURL NS_AVAILABLE_IOS(4_1) __TVOS_PROHIBITED;//原件的URL
UIKIT_EXTERN NSString *const UIImagePickerControllerMediaMetadata NS_AVAILABLE_IOS(4_1) __TVOS_PROHIBITED;//如果是拍照的照片,則需要手動保存到本地,系統不會自動保存拍照成功后的照片
下面是具體的代碼,只寫了核心的部分,當你需要獲取系統圖片時,執行- (void)startGetPhoto;此方法即可。
//點擊更換頭像時開始執行此方法
- (void)startGetPhoto
{
self.actionSheet = [[UIActionSheet alloc] initWithTitle:nil
delegate:self
cancelButtonTitle:@"取消"
destructiveButtonTitle:nil
otherButtonTitles:@"相冊", @"拍照", nil];
self.actionSheet.tag = ActionSheetTagAddPhoto;
[self.actionSheet showInView:self.view];
}
#pragma mark -
#pragma mark UIActionSheetDelegate Call Back Implementation
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (0 == buttonIndex)
{
//打開本地相冊
[self localPhoto];
}
else if(1 == buttonIndex)
{
// 開始拍照
[self takePhoto];
}
}
#pragma mark -
#pragma mark UIImagePickerControllerDelegate Call Back Implementation
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSString *type = [info objectForKey:UIImagePickerControllerMediaType];
//當選擇的類型是圖片
if ([type isEqualToString:@"public.image"])
{
NSString *key = nil;
if (picker.allowsEditing)
{
key = UIImagePickerControllerEditedImage;
}
else
{
key = UIImagePickerControllerOriginalImage;
}
//獲取圖片
UIImage *image = [info objectForKey:key];
if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
// 固定方向
image = [image fixOrientation];//這個方法是UIImage+Extras.h中方法
//壓縮圖片質量
image = [self reduceImage:image percent:0.1];
CGSize imageSize = image.size;
imageSize.height = 320;
imageSize.width = 320;
//壓縮圖片尺寸
image = [self imageWithImageSimple:image scaledToSize:imageSize];
}
//上傳到服務器
//[self doAddPhoto:image];
//關閉相冊界面
[picker dismissViewControllerAnimated:YES completion:^{
}];
}
}
// 開始拍照
-(void)takePhoto
{
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
picker.delegate = self;
//設置拍照后的圖片可被編輯
picker.allowsEditing = YES;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
//先檢查相機可用是否
BOOL cameraIsAvailable = [self checkCamera];
if (YES == cameraIsAvailable) {
[self presentViewController:picker animated:YES completion:nil];
}else {
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"請在iPhone的“設置-隱私-相機”選項中,允許本應用程序訪問你的相機。" delegate:self cancelButtonTitle:@"好,我知道了" otherButtonTitles:nil];
[alert show];
}
}
}
// 打開本地相冊
-(void)localPhoto
{
//本地相冊不需要檢查,因為UIImagePickerController會自動檢查并提醒
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
picker.delegate = self;
//設置選擇后的圖片可被編輯
picker.allowsEditing = YES;
[self presentViewController:picker animated:YES completion:nil];
}
//檢查相機是否可用
- (BOOL)checkCamera
{
NSString *mediaType = AVMediaTypeVideo;
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];
if(AVAuthorizationStatusRestricted == authStatus ||
AVAuthorizationStatusDenied == authStatus)
{
//相機不可用
return NO;
}
//相機可用
return YES;
}
//壓縮圖片質量
-(UIImage *)reduceImage:(UIImage *)image percent:(float)percent
{
NSData *imageData = UIImageJPEGRepresentation(image, percent);
UIImage *newImage = [UIImage imageWithData:imageData];
return newImage;
}
//壓縮圖片尺寸
- (UIImage*)imageWithImageSimple:(UIImage*)image scaledToSize:(CGSize)newSize
{
UIGraphicsBeginImageContext(newSize);
[image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return newImage;
}