//創(chuàng)建一個(gè)相冊(cè)控制器
創(chuàng)新互聯(lián)公司是一家專(zhuān)注于成都網(wǎng)站制作、成都做網(wǎng)站與策劃設(shè)計(jì),潮南網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專(zhuān)注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專(zhuān)業(yè)建站公司;建站業(yè)務(wù)涵蓋:潮南等地區(qū)。潮南做網(wǎng)站價(jià)格咨詢:18980820575
UIImagePickerController *pc = [[UIImagePickerController alloc] init];
//圖片來(lái)源
// UIImagePickerControllerSourceTypePhotoLibrary //相冊(cè)庫(kù)
// UIImagePickerControllerSourceTypeCamera //相機(jī) (模擬器使用相機(jī)會(huì)崩潰,真機(jī)可以)
// UIImagePickerControllerSourceTypeSavedPhotosAlbum 照片庫(kù)
pc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
//是否允許編輯圖片
pc.allowsEditing = YES;
pc.delegate = self; //設(shè)置代理 UINavigationControllerDelegate,UIImagePickerControllerDelegate //相冊(cè)控制器要遵守兩個(gè)協(xié)議
//把相冊(cè)控制器 present 出來(lái)
[self presentViewController:pc animated:YES completion:nil];
相冊(cè)代理里面可以設(shè)置
#pragma mark - 相冊(cè)控制器的代理方法
//選擇圖片完成后調(diào)用
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSLog(@"%@",info); //得到字典
//保存編輯后的圖片 ,在字典里面有信息
self.imageView.image = info[@"UIImagePickerControllerEditedImage"];
// data 轉(zhuǎn)成image
//UIImage imageWithData:#(NSData *)#
// image(.PNG) 轉(zhuǎn)成data
//UIImagePNGRepresentation(#UIImage *image#)
// .jpg 轉(zhuǎn)成data
//參數(shù)2. 壓縮系數(shù),0 - 1.0
NSData *dataOriginal = UIImageJPEGRepresentation(self.imageView.image, 1.0);
NSData *dataEdited = UIImageJPEGRepresentation(self.imageView.image, 0.3);
NSLog(@"%@",NSHomeDirectory());
//把原始的圖片保存到沙盒
[dataOriginal writeToFile:[NSString stringWithFormat:@"%@/Library/1.jpg",NSHomeDirectory()] atomically:YES];
//把編輯過(guò)的圖片也保存進(jìn)去 方便對(duì)比 (編輯了會(huì)壓縮,壓縮過(guò)后的圖片所占外存更小,放大會(huì)模糊)
[dataEdited writeToFile:[NSString stringWithFormat:@"%@/Library/2.jpg",NSHomeDirectory()] atomically:YES];
//返回
[picker dismissViewControllerAnimated:YES completion:nil];
使用系統(tǒng)相冊(cè)的時(shí)候,首先判斷是否有權(quán)限,沒(méi)有權(quán)限的話,可以彈出提示框。
相冊(cè)監(jiān)聽(tīng)中的回調(diào)方法是在 子線程 中的,因此要改變UI布局的話,必須回到主線程
** 幾個(gè)常用的類(lèi) **
**PHAsset **: 代表照片庫(kù)中的一個(gè)資源,跟 ALAsset 類(lèi)似,通過(guò) PHAsset 可以獲取和保存資源。每個(gè)PHAsset就是一張圖片的詳細(xì)信息,包括圖片、位置、時(shí)間等。
** PHFetchOptions **: 獲取資源時(shí)的參數(shù),可以傳 nil,即使用系統(tǒng)默認(rèn)值。
** PHFetchResult **: 表示一系列的資源集合,也可以是相冊(cè)的集合。
** PHAssetCollection **: 表示一個(gè)相冊(cè)或者一個(gè)時(shí)刻,或者是一個(gè)智能相冊(cè)(系統(tǒng)提供的特定的一系列相冊(cè),例如:最近刪除,視頻列表,收藏等等)。
** PHImageManager **: 用于處理資源的加載,加載圖片的過(guò)程帶有緩存處理,可以通過(guò)傳入一個(gè) PHImageRequestOptions 控制資源的輸出尺寸等規(guī)格。
** PHImageRequestOptions **: 如上面所說(shuō),控制加載圖片時(shí)的一系列參數(shù)。
創(chuàng)建工程項(xiàng)目和視圖控制器
創(chuàng)建一個(gè)single view工程項(xiàng)目,自動(dòng)創(chuàng)建一個(gè)ViewController試圖控制器。
創(chuàng)建并初始化UI控件
在ViewController.m創(chuàng)建并初始化UIImageView用于顯示獲取的圖片,UIButton及響應(yīng)事件。
設(shè)置宏定義、添加代理
判斷是否是iOS8以上版本系統(tǒng):
#define IOS8 ([[[UIDevice currentDevice] systemVersion] floatValue] = 8.0 ? YES : NO)
調(diào)用相冊(cè)需要使用:
UIImagePickerControllerDelegate,UINavigationControllerDelegate代理,iOS7使用UIActionSheet需要添加UIActionSheetDelegate。
完善按鈕響應(yīng)事件
iOS8使用UIAlertController選擇獲取圖片方式;
iOS8使用UIAlertAction選擇獲取圖片方式。
添加自定義方法保存圖片到本地沙盒
選擇完成后調(diào)用。
獲取圖片緩存并顯示
完成示例
要允許app調(diào)用相機(jī),讀取相冊(cè)圖片。
首先,給大家說(shuō)一下一般的保存 View 為圖片到相冊(cè)
這樣的方法雖然可以快速實(shí)現(xiàn),但是保存的圖片比較模糊,清晰度不夠高。
下面是保存 View 為高清圖片到相冊(cè)
大家可以看到,只是換了一個(gè)繪制圖片的方法,多了兩個(gè)參數(shù)。其中第二個(gè)參數(shù)表示是否是非透明的。如果需要顯示半透明效果,需要傳NO,否則傳YES。不過(guò)我所嘗試了YES和NO所出來(lái)的效果沒(méi)什么區(qū)別,第三個(gè)參數(shù)就是屏幕密度了,關(guān)鍵就是第三個(gè)參數(shù) [UIScreen mainScreen].scale。此方法所保存的圖片的清晰度確實(shí)有了很大的提高。
保存圖片成功調(diào)用的方法
注意:由于是保存圖片到相冊(cè),所以是要訪問(wèn)系統(tǒng)相冊(cè)的,所以需要在info.plist文件中里邊添加字段:Privacy - Photo Library Usage Description
最后,希望能夠幫到有需要的朋友們,愿我們能夠一起學(xué)習(xí)進(jìn)步,在開(kāi)發(fā)的道路上越走越順利!