iOS獲取、寫入系統(tǒng)相冊圖片

為什么要調(diào)用系統(tǒng)相冊

現(xiàn)在很多項(xiàng)目都會用到調(diào)用系統(tǒng)相冊,例如保存圖片到系統(tǒng)相冊都毒、選取相冊中的圖片、給聯(lián)系人設(shè)置頭像碰缔、聊天時(shí)給好友發(fā)送照片等账劲。下面就看下如何調(diào)取系統(tǒng)相冊:

讀取方式

*讀取一張圖片

  • 我們可以利用UIImagePickerController這個(gè)類來完成,代碼比較簡單如下所示
  • 遵守<UIImagePickerControllerDelegate,UINavigationControllerDelegate>這兩個(gè)協(xié)議
//獲取單張圖片
- (IBAction)fetchSinglePicture:(id)sender {
    
    //創(chuàng)建UIImagePickerController
    UIImagePickerController *pickVC = [[UIImagePickerController alloc] init];
    
    //設(shè)置圖片源類型
    pickVC.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; //取出所有圖片資源的相簿
    
    //設(shè)置代理
    pickVC.delegate = self;
    
    
    [self presentViewController:pickVC animated:YES completion:nil];
}

*要執(zhí)行的代理方法

#pragma mark------- UIImagePickerControllerDelegate

/**
 *  選擇完畢執(zhí)行的方法
 *
 *  @param picker 模態(tài)出的控制器
 *  @param info   含有圖片信息的字典
 */
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {

    //dismiss
    [picker dismissViewControllerAnimated:YES completion:nil];
   
    //取出選中的圖片
    self.imageView.image = info[UIImagePickerControllerOriginalImage];
    
}
  • 效果圖如下
11.gif

  • 獲取多張圖
  • 需要導(dǎo)入#import <Photos/Photos.h>
  • 9.0之前#import<AssetsLibrary/AssetsLibrary.h>這個(gè)類
  • 9.0之后推薦蘋果官方推薦使用#import <Photos/Photos.h> 我是用了一個(gè)集合視圖用來展示效果,并沒有寫選擇功能,只是單純演示
//獲取相機(jī)膠卷所有圖片
- (void)fetchImages {
 
    //獲取相機(jī)膠卷所有圖片
    PHFetchResult *assets = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:nil];
    //遍歷
    for (PHAsset *asset in assets) {
        
        //取出圖片
        [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:CGSizeMake(100, 100) contentMode:PHImageContentModeDefault options:nil resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
            
            [self.imagesArray addObject:result];
            
            dispatch_async(dispatch_get_main_queue(), ^{
                [self.collectionView reloadData];
            });
            
        }];
    }
}
- 
  • 效果如下
22.gif

Photos框架簡單介紹下

  • 蘋果自帶的框架,Photos框架須知

1.PHAsset : 一個(gè)PHAsset對象代表一張圖片或者一個(gè)視頻文件

  • 負(fù)責(zé)查詢一堆的PHAsset對象

2.PHAssetCollection : 一個(gè)PHAssetCollection對象代表一個(gè)相冊

  • 負(fù)責(zé)查詢一堆的PHAssetCollection對象

3.PHAssetChangeRequest

  • 負(fù)責(zé)執(zhí)行對PHAsset的【增刪改】操作
  • 這個(gè)類方法只能放在
-[PHPhotoLibrary performChanges:completionHandler:]或者
-[PHPhotoLibrary performChangesAndWait:error:]方法的block中使用

4.PHAssetCollectionChangeRequest

  • 負(fù)責(zé)執(zhí)行對PHAssetCollection的【增刪改】操作
  • 這個(gè)方法類只能放在
-[PHPhotoLibrary performChanges:completionHandler:] 或者
-[PHPhotoLibrary performChangesAndWait:error:]方法的block中使用

當(dāng)然也可以讀取相簿 這里方法和讀取相機(jī)膠卷的步驟基本相同


圖片保存系統(tǒng)相機(jī)膠卷

  • 方式一:
 // UIImageWriteToSavedPhotosAlbum 這個(gè)方法,默認(rèn)保存到系統(tǒng)相機(jī)膠卷,但是@selector后面的方法 必須是這種格式:  - (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;
   //保存圖片到系統(tǒng)相冊
  UIImageWriteToSavedPhotosAlbum( self.imageView.image, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);


/**
 *  寫入圖片后執(zhí)行的操作
 *
 *  @param image       寫入的圖片
 *  @param error       錯(cuò)誤信息
 *  @param contextInfo UIImageWriteToSavedPhotosAlbum第三個(gè)參數(shù)
 */
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo {

    if (error) {
        
      NSLog(@"保存失敗");
   }
   else  {
      NSLog(@"保存成功");
}
  • 方式二:
  • 注意點(diǎn): PHAssetChangeRequest 的方法

必須在-[PHPhotoLibrary performChanges:completionHandler:]
或者-[PHPhotoLibrary performChangesAndWait:error:]方法的block中使用

    - (void)saveImage {

     [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        
        //1,保存圖片到系統(tǒng)相冊  
       [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image];

    } completionHandler:^(BOOL success, NSError * _Nullable error) {
        
        if (!success) return ;
         NSLog(@"保存成功");
    }];  

} 

添加自定義相簿到系統(tǒng)相冊中

  • 我這里添加一個(gè)叫ZKQTitle的相簿

- (void)saveImage {

    //圖片的本地標(biāo)識符
   __block NSString *assetIdentifier = nil;
    [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
        
        //1,保存圖片到系統(tǒng)相冊
       assetIdentifier = [PHAssetChangeRequest creationRequestForAssetFromImage:self.imageView.image].placeholderForCreatedAsset.localIdentifier;

    } completionHandler:^(BOOL success, NSError * _Nullable error) {
        
        if (!success) return ;
        
        //2,獲取相簿
        PHAssetCollection *assetCollection = [self assetCollection];
        
           [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
             //3,添加照片
               //獲取圖片
               PHAsset *asset = [PHAsset fetchAssetsWithLocalIdentifiers:@[assetIdentifier] options:nil].firstObject;
               
               //添加圖片的請求
               PHAssetCollectionChangeRequest *request = [PHAssetCollectionChangeRequest changeRequestForAssetCollection:assetCollection];
               //添加圖片
               [request addAssets:@[asset]];
           } completionHandler:^(BOOL success, NSError * _Nullable error) {
               
               if (!success) return;

                NSLog(@"保存成功");
               
           }];
 
    }];


}



/**
 *  獲取相簿
 *
 *  @return 獲取到的相簿
 */

- (PHAssetCollection *)assetCollection {

    //獲取所有相簿
    PHFetchResult *reult = [PHAssetCollection fetchAssetCollectionsWithType:(PHAssetCollectionTypeAlbum) subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
    
    //遍歷所有相簿查找名字叫做 ZKQtitle的相簿
    for (PHAssetCollection *collection in reult) {
        
        //如果有 返回
        if ([collection.localizedTitle isEqualToString:ZKQtitle]) {
            
            return collection;
        }
    }
    
    //沒有則創(chuàng)建
    
    //相簿的本地標(biāo)識符
    __block NSString *collectionIdentifier = nil;
    
    [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
        //獲取相簿本地標(biāo)識符
        collectionIdentifier= [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:ZKQtitle].placeholderForCreatedAssetCollection.localIdentifier;
        
    } error:nil];
    
    return [PHAssetCollection fetchAssetCollectionsWithLocalIdentifiers:@[collectionIdentifier] options:nil].firstObject;
}
  • 效果如下
33.gif

總結(jié)

就簡單介紹這么多,代碼步驟的注釋還是很清楚的.具體使用還是很簡單的,官方文檔很簡單,如有疑問請留言,覺得不錯(cuò),請點(diǎn)擊喜歡,關(guān)注我!!!!,另外有什么問題,請留言~~~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末佳窑,一起剝皮案震驚了整個(gè)濱河市帜平,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌敞嗡,老刑警劉巖梗肝,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件榛瓮,死亡現(xiàn)場離奇詭異,居然都是意外死亡统捶,警方通過查閱死者的電腦和手機(jī)榆芦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門柄粹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匆绣,你說我怎么就攤上這事驻右。” “怎么了崎淳?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵堪夭,是天一觀的道長。 經(jīng)常有香客問我拣凹,道長森爽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任嚣镜,我火速辦了婚禮爬迟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘菊匿。我一直安慰自己付呕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布跌捆。 她就那樣靜靜地躺著徽职,像睡著了一般。 火紅的嫁衣襯著肌膚如雪佩厚。 梳的紋絲不亂的頭發(fā)上姆钉,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天,我揣著相機(jī)與錄音抄瓦,去河邊找鬼潮瓶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛闺鲸,可吹牛的內(nèi)容都是我干的筋讨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼摸恍,長吁一口氣:“原來是場噩夢啊……” “哼悉罕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起立镶,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤壁袄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后媚媒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嗜逻,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年缭召,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了栈顷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片逆日。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖萄凤,靈堂內(nèi)的尸體忽然破棺而出室抽,到底是詐尸還是另有隱情,我是刑警寧澤靡努,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布坪圾,位于F島的核電站,受9級特大地震影響惑朦,放射性物質(zhì)發(fā)生泄漏兽泄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一漾月、第九天 我趴在偏房一處隱蔽的房頂上張望病梢。 院中可真熱鬧,春花似錦栅屏、人聲如沸飘千。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缔莲,卻和暖如春哥纫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背痴奏。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工蛀骇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人读拆。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓擅憔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親檐晕。 傳聞我的和親對象是個(gè)殘疾皇子暑诸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

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