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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末负饲,一起剝皮案震驚了整個(gè)濱河市堤魁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌返十,老刑警劉巖妥泉,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異吧慢,居然都是意外死亡涛漂,警方通過(guò)查閱死者的電腦和手機(jī)赏表,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門检诗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人瓢剿,你說(shuō)我怎么就攤上這事逢慌。” “怎么了间狂?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵攻泼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)忙菠,這世上最難降的妖魔是什么何鸡? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮牛欢,結(jié)果婚禮上骡男,老公的妹妹穿的比我還像新娘。我一直安慰自己傍睹,他們只是感情好隔盛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拾稳,像睡著了一般吮炕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上访得,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天龙亲,我揣著相機(jī)與錄音,去河邊找鬼震鹉。 笑死俱笛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的传趾。 我是一名探鬼主播迎膜,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼浆兰!你這毒婦竟也來(lái)了磕仅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤簸呈,失蹤者是張志新(化名)和其女友劉穎榕订,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜕便,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡劫恒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了轿腺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片两嘴。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖族壳,靈堂內(nèi)的尸體忽然破棺而出憔辫,到底是詐尸還是另有隱情,我是刑警寧澤仿荆,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布贰您,位于F島的核電站坏平,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏锦亦。R本人自食惡果不足惜舶替,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望杠园。 院中可真熱鬧坎穿,春花似錦、人聲如沸返劲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)篮绿。三九已至孵延,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間亲配,已是汗流浹背尘应。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吼虎,地道東北人犬钢。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像思灰,于是被迫代替她去往敵國(guó)和親玷犹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容