UIImagePickerController拍照與攝像
該類繼承自UINavigationController類
步驟:
檢查媒體來(lái)源模式是否可用
檢查該來(lái)源模式下所支持的媒體類型
創(chuàng)建圖像選取控制器蕊唐,設(shè)置其屬性并顯示
在委托協(xié)議方法中處理
1.檢查媒體來(lái)源
調(diào)用UIImagePickerController類的靜態(tài)方法isSourceTypeAvailable來(lái)檢查
sourceType是一個(gè)UIImagePickerControllerSourceType類型的枚舉值,它表示圖像選取控制器的3種不同的媒體來(lái)源模式
UIImagePickerControllerSourceTypePhotoLibrary:照片庫(kù)模式烁设。圖像選取控制器以該模式顯示時(shí)會(huì)瀏覽系統(tǒng)照片庫(kù)的根目錄刃泌。
UIImagePickerControllerSourceTypeCamera:相機(jī)模式,圖像選取控制器以該模式顯示時(shí)可以進(jìn)行拍照或攝像。
UIImagePickerControllerSourceTypeSavedPhotosAlbum:相機(jī)膠卷模式耙替,圖像選取控制器以該模式顯示時(shí)會(huì)瀏覽相機(jī)膠卷目錄亚侠。
如果設(shè)備支持指定的媒體來(lái)源模式,則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è)置圖像選取控制器的來(lái)源模式為相機(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è)置圖像選取控制器的來(lái)源模式為相機(jī)模式
imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
//設(shè)置圖像選取控制器的類型為動(dòng)態(tài)圖像
imagePickerController.mediaTypes = [[[NSArray alloc] initWithObjects:(NSString*)kUTTypeMovie, nil] autorelease];
//設(shè)置攝像圖像品質(zhì)
imagePickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;
//設(shè)置最長(zhǎng)攝像時(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];
//將該圖像保存到媒體庫(kù)中
UIImageWriteToSavedPhotosAlbum(editedImage, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
}else if ([mediaType isEqualToString:(NSString *)kUTTypeMovie])
{
//獲取視頻文件的url
NSURL* mediaURL = [info objectForKey:UIImagePickerControllerMediaURL];
//創(chuàng)建ALAssetsLibrary對(duì)象并將視頻保存到媒體庫(kù)
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è)頁(yè)面
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來(lái)處理喘漏。突然發(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
恍然大悟,很簡(jiǎn)單翩迈,用UIImagePickerControllerEditedImage持灰,萬(wàn)事搞定。