IOS 相機,相冊獲取圖片

UIImagePickerController拍照與攝像

該類繼承自UINavigationController類

步驟:

檢查媒體來源模式是否可用

檢查該來源模式下所支持的媒體類型

創建圖像選取控制器,設置其屬性并顯示

在委托協議方法中處理

1.檢查媒體來源

調用UIImagePickerController類的靜態方法isSourceTypeAvailable來檢查

sourceType是一個UIImagePickerControllerSourceType類型的枚舉值,它表示圖像選取控制器的3種不同的媒體來源模式

UIImagePickerControllerSourceTypePhotoLibrary:照片庫模式。圖像選取控制器以該模式顯示時會瀏覽系統照片庫的根目錄。

UIImagePickerControllerSourceTypeCamera:相機模式,圖像選取控制器以該模式顯示時可以進行拍照或攝像。

UIImagePickerControllerSourceTypeSavedPhotosAlbum:相機膠卷模式,圖像選取控制器以該模式顯示時會瀏覽相機膠卷目錄。

如果設備支持指定的媒體來源模式,則isSourceTypeAvailable:方法返回YES,否則返回NO。

2.檢查支持的媒體類型

調用UIImagePickerController類的另一個靜態方法 availableMediaTypesForSourceType:

返回的是字符串數組,kUTTypeImage表示靜態圖片,kUTTypeMovie表示視頻。這兩個字符串常量定義在MobileCoreServices框架中。

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

//允許用戶進行編輯

imagePickerController.allowsEditing = YES;

//設置委托對象

imagePickerController.delegate = self;

//以模視圖控制器的形式顯示

[self presentModalViewController:imagePickerController animated:YES];

[imagePickerController release];

}

- (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 *)kUTTypeImage]) {

//支持攝像

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

//設置攝像圖像品質

imagePickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;

//設置最長攝像時間

imagePickerController.videoMaximumDuration = 30;

//允許用戶進行編輯

imagePickerController.allowsEditing = YES;

//設置委托對象

imagePickerController.delegate = self;

//以模式視圖控制器的形式顯示

[self presentModalViewController:imagePickerController animated:YES];

[imagePickerController release];

}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)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);

}

}];

[assetsLibrary release];

}

[picker dismissModalViewControllerAnimated:YES];

}

//load user image

- (void)UesrImageClicked

{

UIActionSheet *sheet;

// 判斷是否支持相機

if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])

{

sheet= [[UIActionSheet alloc] initWithTitle:@"選擇圖像" delegate:self cancelButtonTitle:nil destructiveButtonTitle:@"取消" otherButtonTitles:@"拍照", @"從相冊選擇", nil];

}

else {

sheet = [[UIActionSheet alloc] initWithTitle:@"選擇圖像" delegate:self cancelButtonTitle:nil destructiveButtonTitle:@"取消" otherButtonTitles:@"從相冊選擇", nil];

}

sheet.tag = 255;

[sheet showInView:self.view];

}

#pragma mark - action sheet delegte

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex

{

if (actionSheet.tag == 255) {

NSUInteger sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

// 判斷是否支持相機

if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

switch (buttonIndex) {

case 0:

return;

case 1: //相機

sourceType = UIImagePickerControllerSourceTypeCamera;

break;

case 2: //相冊

sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

break;

}

}

else {

if (buttonIndex == 0) {

return;

} else {

sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;

}

}

// 跳轉到相機或相冊頁面

UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];

imagePickerController.delegate = self;

imagePickerController.allowsEditing = YES;

imagePickerController.sourceType = sourceType;

[self presentViewController:imagePickerController animated:YES completion:^{}];

}

}

#pragma mark - image picker delegte

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

{

[picker dismissViewControllerAnimated:YES completion:^{}];

UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage];

userImageView.image = image;

NSData *imageData = UIImageJPEGRepresentation(image, COMPRESSED_RATE);

UIImage *compressedImage = [UIImage imageWithData:imageData];

[HttpRequestManager uploadImage:compressedImage httpClient:self.httpClient delegate:self];

}

創建一張表單,選擇相機或者相冊,然后用回調函數處理返回的圖片。

但是返回的圖像并不是正方形,顯示在用戶頭像的View里面產生明顯的拉伸。研究了很久各種裁剪算法,甚至想創建一個view來處理。突然發現代碼中從相機、相冊獲取圖片時采用的的

UIImagePickerControllerOriginalImage

于是跟蹤進去一看:

UIKIT_EXTERN NSString *const UIImagePickerControllerMediaType;? ? ? // an NSString (UTI, i.e. kUTTypeImage)

UIKIT_EXTERN NSString *const UIImagePickerControllerOriginalImage;? // a UIImage

UIKIT_EXTERN NSString *const UIImagePickerControllerEditedImage;? ? // a UIImage

UIKIT_EXTERN NSString *const UIImagePickerControllerCropRect; ? ? ? // an NSValue (CGRect)

UIKIT_EXTERN NSString *const UIImagePickerControllerMediaURL; ? ? ? // an NSURL

UIKIT_EXTERN NSString *const UIImagePickerControllerReferenceURL? ? ? ? NS_AVAILABLE_IOS(4_1);? // an NSURL that references an

恍然大悟,很簡單,用UIImagePickerControllerEditedImage,萬事搞定。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容