IOS 相機(jī),相冊(cè)獲取圖片

UIImagePickerController拍照與攝像

該類繼承自UINavigationController類

步驟:

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

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

創(chuàng)建圖像選取控制器,設(shè)置其屬性并顯示

在委托協(xié)議方法中處理

1.檢查媒體來源

調(diào)用UIImagePickerController類的靜態(tài)方法isSourceTypeAvailable來檢查

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

UIImagePickerControllerSourceTypePhotoLibrary:照片庫模式。圖像選取控制器以該模式顯示時(shí)會(huì)瀏覽系統(tǒng)照片庫的根目錄。

UIImagePickerControllerSourceTypeCamera:相機(jī)模式,圖像選取控制器以該模式顯示時(shí)可以進(jìn)行拍照或攝像。

UIImagePickerControllerSourceTypeSavedPhotosAlbum:相機(jī)膠卷模式,圖像選取控制器以該模式顯示時(shí)會(huì)瀏覽相機(jī)膠卷目錄。

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

2.檢查支持的媒體類型

調(diào)用UIImagePickerController類的另一個(gè)靜態(tài)方法 availableMediaTypesForSourceType:

返回的是字符串?dāng)?shù)組,kUTTypeImage表示靜態(tài)圖片,kUTTypeMovie表示視頻。這兩個(gè)字符串常量定義在MobileCoreServices框架中。

- (IBAction)takePictureButtonClick:(id)sender{

//檢查相機(jī)模式是否可用

if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

NSLog(@"sorry, no camera or camera is unavailable.");

return;

}

//獲得相機(jī)模式下支持的媒體類型

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;

}

//創(chuàng)建圖像選取控制器

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

//設(shè)置圖像選取控制器的來源模式為相機(jī)模式

imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;

//設(shè)置圖像選取控制器的類型為靜態(tài)圖像

imagePickerController.mediaTypes = [[[NSArray alloc] initWithObjects:(NSString*)kUTTypeImage, nil] autorelease];

//允許用戶進(jìn)行編輯

imagePickerController.allowsEditing = YES;

//設(shè)置委托對(duì)象

imagePickerController.delegate = self;

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

[self presentModalViewController:imagePickerController animated:YES];

[imagePickerController release];

}

- (IBAction)captureVideoButtonClick:(id)sender{

//檢查相機(jī)模式是否可用

if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

NSLog(@"sorry, no camera or camera is unavailable!!!");

return;

}

//獲得相機(jī)模式下支持的媒體類型

NSArray* availableMediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];

BOOL canTakeVideo = NO;

for (NSString* mediaType in availableMediaTypes) {

if ([mediaType isEqualToString:(NSString *)kUTTypeImage]) {

//支持?jǐn)z像

canTakeVideo = YES;

break;

}

}

//檢查是否支持?jǐn)z像

if (!canTakeVideo) {

NSLog(@"sorry, capturing video is not supported.!!!");

return;

}

//創(chuàng)建圖像選取控制器

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

//設(shè)置圖像選取控制器的來源模式為相機(jī)模式

imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;

//設(shè)置圖像選取控制器的類型為動(dòng)態(tài)圖像

imagePickerController.mediaTypes = [[[NSArray alloc] initWithObjects:(NSString*)kUTTypeMovie, nil] autorelease];

//設(shè)置攝像圖像品質(zhì)

imagePickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;

//設(shè)置最長攝像時(shí)間

imagePickerController.videoMaximumDuration = 30;

//允許用戶進(jìn)行編輯

imagePickerController.allowsEditing = YES;

//設(shè)置委托對(duì)象

imagePickerController.delegate = self;

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

[self presentModalViewController:imagePickerController animated:YES];

[imagePickerController release];

}

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

//打印出字典中的內(nèi)容

NSLog(@"get the media info: %@", info);

//獲取媒體類型

NSString* mediaType = [info objectForKey:UIImagePickerControllerMediaType];

//判斷是靜態(tài)圖像還是視頻

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

//創(chuàng)建ALAssetsLibrary對(duì)象并將視頻保存到媒體庫

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;

// 判斷是否支持相機(jī)

if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])

{

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

}

else {

sheet = [[UIActionSheet alloc] initWithTitle:@"選擇圖像" delegate:self cancelButtonTitle:nil destructiveButtonTitle:@"取消" otherButtonTitles:@"從相冊(cè)選擇", 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;

// 判斷是否支持相機(jī)

if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

switch (buttonIndex) {

case 0:

return;

case 1: //相機(jī)

sourceType = UIImagePickerControllerSourceTypeCamera;

break;

case 2: //相冊(cè)

sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

break;

}

}

else {

if (buttonIndex == 0) {

return;

} else {

sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;

}

}

// 跳轉(zhuǎn)到相機(jī)或相冊(cè)頁面

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

}

創(chuàng)建一張表單,選擇相機(jī)或者相冊(cè),然后用回調(diào)函數(shù)處理返回的圖片。

但是返回的圖像并不是正方形,顯示在用戶頭像的View里面產(chǎn)生明顯的拉伸。研究了很久各種裁剪算法,甚至想創(chuàng)建一個(gè)view來處理。突然發(fā)現(xiàn)代碼中從相機(jī)、相冊(cè)獲取圖片時(shí)采用的的

UIImagePickerControllerOriginalImage

于是跟蹤進(jìn)去一看:

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,萬事搞定。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容