//創(chuàng)建一個相冊控制器
網(wǎng)站建設哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、小程序開發(fā)、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了鶴城免費建站歡迎大家使用!
UIImagePickerController *pc = [[UIImagePickerController alloc] init];
//圖片來源
// UIImagePickerControllerSourceTypePhotoLibrary //相冊庫
// UIImagePickerControllerSourceTypeCamera //相機 (模擬器使用相機會崩潰,真機可以)
// UIImagePickerControllerSourceTypeSavedPhotosAlbum 照片庫
pc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
//是否允許編輯圖片
pc.allowsEditing = YES;
pc.delegate = self; //設置代理 UINavigationControllerDelegate,UIImagePickerControllerDelegate //相冊控制器要遵守兩個協(xié)議
//把相冊控制器 present 出來
[self presentViewController:pc animated:YES completion:nil];
相冊代理里面可以設置
#pragma mark - 相冊控制器的代理方法
//選擇圖片完成后調(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];
//把編輯過的圖片也保存進去 方便對比 (編輯了會壓縮,壓縮過后的圖片所占外存更小,放大會模糊)
[dataEdited writeToFile:[NSString stringWithFormat:@"%@/Library/2.jpg",NSHomeDirectory()] atomically:YES];
//返回
[picker dismissViewControllerAnimated:YES completion:nil];
首先,給大家說一下一般的保存 View 為圖片到相冊
這樣的方法雖然可以快速實現(xiàn),但是保存的圖片比較模糊,清晰度不夠高。
下面是保存 View 為高清圖片到相冊
大家可以看到,只是換了一個繪制圖片的方法,多了兩個參數(shù)。其中第二個參數(shù)表示是否是非透明的。如果需要顯示半透明效果,需要傳NO,否則傳YES。不過我所嘗試了YES和NO所出來的效果沒什么區(qū)別,第三個參數(shù)就是屏幕密度了,關鍵就是第三個參數(shù) [UIScreen mainScreen].scale。此方法所保存的圖片的清晰度確實有了很大的提高。
保存圖片成功調(diào)用的方法
注意:由于是保存圖片到相冊,所以是要訪問系統(tǒng)相冊的,所以需要在info.plist文件中里邊添加字段:Privacy - Photo Library Usage Description
最后,希望能夠幫到有需要的朋友們,愿我們能夠一起學習進步,在開發(fā)的道路上越走越順利!
1、首先要開啟app對相冊獲取的權限,找到app對應的Info.plist文件,在Key值一欄填入:Privacy - Photo Library Usage Description,然后在Value一欄填入“此App需要您的同意才能讀取相冊”。
這樣,再用戶同意之后,我們的app就能拿到對相冊訪問的權限了。
2、找到對應控制器的.m文件,在文件中創(chuàng)建一個全局的UIImagePickerController對象和一個UIImageView對象,我的是在ViewController.m文件中創(chuàng)建的。
3.初始化剛才添加imageView和imagePickerVC,初始化時,同時設置imagePickerVC的delegate和圖片是否允許編輯,我習慣在懶加載中初始化
記得在@interface添加遵循的協(xié)議
4.在viewDidLoad方法中初始化一個button,同時將剛才的imageView和button一起添加到self.view中
5.添加button點擊時觸發(fā)的方法
6.設置UIimagePickerController的代理方法,用來獲取我們打開相冊后選擇的圖片
這樣,就能打開系統(tǒng)的相冊了
下面是效果圖:
創(chuàng)建工程項目和視圖控制器
創(chuàng)建一個single view工程項目,自動創(chuàng)建一個ViewController試圖控制器。
創(chuàng)建并初始化UI控件
在ViewController.m創(chuàng)建并初始化UIImageView用于顯示獲取的圖片,UIButton及響應事件。
設置宏定義、添加代理
判斷是否是iOS8以上版本系統(tǒng):
#define IOS8 ([[[UIDevice currentDevice] systemVersion] floatValue] = 8.0 ? YES : NO)
調(diào)用相冊需要使用:
UIImagePickerControllerDelegate,UINavigationControllerDelegate代理,iOS7使用UIActionSheet需要添加UIActionSheetDelegate。
完善按鈕響應事件
iOS8使用UIAlertController選擇獲取圖片方式;
iOS8使用UIAlertAction選擇獲取圖片方式。
添加自定義方法保存圖片到本地沙盒
選擇完成后調(diào)用。
獲取圖片緩存并顯示
完成示例
要允許app調(diào)用相機,讀取相冊圖片。
使用系統(tǒng)相冊的時候,首先判斷是否有權限,沒有權限的話,可以彈出提示框。
相冊監(jiān)聽中的回調(diào)方法是在 子線程 中的,因此要改變UI布局的話,必須回到主線程
** 幾個常用的類 **
**PHAsset **: 代表照片庫中的一個資源,跟 ALAsset 類似,通過 PHAsset 可以獲取和保存資源。每個PHAsset就是一張圖片的詳細信息,包括圖片、位置、時間等。
** PHFetchOptions **: 獲取資源時的參數(shù),可以傳 nil,即使用系統(tǒng)默認值。
** PHFetchResult **: 表示一系列的資源集合,也可以是相冊的集合。
** PHAssetCollection **: 表示一個相冊或者一個時刻,或者是一個智能相冊(系統(tǒng)提供的特定的一系列相冊,例如:最近刪除,視頻列表,收藏等等)。
** PHImageManager **: 用于處理資源的加載,加載圖片的過程帶有緩存處理,可以通過傳入一個 PHImageRequestOptions 控制資源的輸出尺寸等規(guī)格。
** PHImageRequestOptions **: 如上面所說,控制加載圖片時的一系列參數(shù)。