保存圖片到系統(tǒng)相冊并獲取圖片

方法一:UIKit提供的便利方法

首先保存圖片到系統(tǒng)相冊UIKit提供了一種很簡單的方法猾担,一句話就搞定。但如果想要取得剛剛保存的地址就沒辦法了秤朗。

UIImageWriteToSavedPhotosAlbum(
                                   UIImage * _Nonnull image,
                                   id  _Nullable completionTarget,
                                   SEL  _Nullable completionSelector,
                                   void * _Nullable contextInfo
                                   );
  • 各參數說明:
    image 為需要保存的圖片對象,id是target對象圃验,sel是selector鲁猩,即target對象上的方法名腾供,contextInfo是任意指針,會傳遞到selector定義的方法上遮怜。一般是當完成后調用方法時使用淋袖,或者在完成時出錯的處理。

方法二:photoKit來保存

假如現在場景是:調用系統(tǒng)相機拍下一張照片奈泪,準備保存到系統(tǒng)相機膠卷适贸,并獲取到圖片信息灸芳。此時我們需要通過photoKit來保存,

        // 保存相片到相機膠卷
        NSError *error1 = nil;
        __block PHObjectPlaceholder *createdAsset = nil;
        [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
            createdAsset = [PHAssetCreationRequest creationRequestForAssetFromImage:image].placeholderForCreatedAsset;
        } error:&error1];

接下來我們需要去獲取剛剛保存到的圖片拜姿,本人的基本思路是先拿到相機膠卷的所有照片烙样,并拿到相機膠卷這個相冊中的所有PHAsset對象,又由于我們剛剛保存的圖片是存放在最后一張的,所以只需要拿數組內的最后一張照片的PHAsset對象蕊肥。最后再通過最后一個PHAsset對象(剛剛保存的照片)獲取圖片信息谒获。

 /** 最后一張照片為剛剛拍照傳上去的 */
 PHAsset *PHasset = [allPhots lastObject];

這里仔細講一下根據PHAsset獲取圖片信息中的[PHCachingImageManager defaultManager] requestImageForAsset,本人在這里遇到一點坑。詳細請參照iOS獲取圖像的方式和坑點
#pragma mark - <  根據PHAsset獲取圖片信息  >
- (void)accessToImageAccordingToTheAsset:(PHAsset *)asset size:(CGSize)size resizeMode:(PHImageRequestOptionsResizeMode)resizeMode completion:(void(^)(UIImage *image,NSDictionary *info))completion
{
    static PHImageRequestID requestID = -1;
    
    CGFloat scale = [UIScreen mainScreen].scale;
    CGFloat width = MIN([UIScreen mainScreen].bounds.size.width, 500);
    if (requestID >= 1 && size.width / width == scale) {
        [[PHCachingImageManager defaultManager] cancelImageRequest:requestID];
    }
    PHImageRequestOptions *option = [[PHImageRequestOptions alloc] init];
    option.deliveryMode = PHImageRequestOptionsDeliveryModeOpportunistic;
    //    option.resizeMode = PHImageRequestOptionsResizeModeFast;
    option.resizeMode = resizeMode;
    
    requestID = [[PHCachingImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeAspectFill options:option resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) {
       /** 必須做判斷壁却,要不然將走多次完成的completion的block */
        if (![[info objectForKey:PHImageResultIsDegradedKey] boolValue]) {
            
            dispatch_async(dispatch_get_main_queue(), ^{
                completion(result,info);
            });
        }
    }];
}

由于本人批狱,只需要從相冊拿到我設置需要的對應尺寸的照片,但是實際上是會多次走completion的block展东,在完成這里主要解釋一下下面這個判斷:

需要注意的是赔硫,該方法在默認情況下是異步執(zhí)行的,而且 Photos 庫可能會多次執(zhí)行 resultHandler 塊盐肃,因為這種情況就是圖像需要從 iCloud 中下載的情況爪膊。在 requestImageForAsset 返回的內容中,一開始的那一次請求中會返回一個小尺寸的圖像版本砸王,當高清圖像還在下載時推盛,開發(fā)者可以首先給用戶展示這個低清的圖像版本,然后 block 在多次調用后谦铃,最終會返回高清的原圖耘成。至于當前返回的圖像是哪個版本的圖像,可以通過 block 返回的 NSDictionary info 中獲知驹闰,PHImageResultIsDegradedKey 表示當前返回的 UIImage 是低清圖瘪菌。如果需要判斷是否已經獲得高清圖,可以這樣判斷:

if (![[info objectForKey:PHImageResultIsDegradedKey] boolValue]) {
            //這樣只會走一次獲取到高清圖時
            dispatch_async(dispatch_get_main_queue(), ^{
                completion(result,info);
            });
最后將本人在拍完照后走完成代理時的詳細操作附上,至于其中獲取相冊所有圖片的方法可見本人上一篇文章:獲取相冊所有圖片
#pragma mark--uiimagepickercontroller delegate

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
{

    CGFloat scale = [UIScreen mainScreen].scale;
    if (picker.sourceType == UIImagePickerControllerSourceTypeCamera)
    {
        [picker dismissViewControllerAnimated:YES completion:^{
        }];
        UIImage *image = [info valueForKey:UIImagePickerControllerOriginalImage];

        // 保存相片到相機膠卷
        NSError *error1 = nil;
        __block PHObjectPlaceholder *createdAsset = nil;
        [[PHPhotoLibrary sharedPhotoLibrary] performChangesAndWait:^{
            createdAsset = [PHAssetCreationRequest creationRequestForAssetFromImage:image].placeholderForCreatedAsset;
        } error:&error1];
        if (error1) {
            
        }
        else
        {
            NSMutableArray *allPhots = [NSMutableArray array];
            // 相機膠卷
            PHFetchResult *smartAlbums = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
            
            for (NSInteger i = 0; i < smartAlbums.count; i++) {
                // 是否按創(chuàng)建時間排序
                PHFetchOptions *option = [[PHFetchOptions alloc] init];
                option.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
                option.predicate = [NSPredicate predicateWithFormat:@"mediaType == %ld", PHAssetMediaTypeImage];
                PHCollection *collection = smartAlbums[i];
                
                //遍歷獲取相冊
                if ([collection isKindOfClass:[PHAssetCollection class]]) {
                    if ([collection.localizedTitle isEqualToString:@"相機膠卷"]) {
                        PHAssetCollection *assetCollection = (PHAssetCollection *)collection;
                        PHFetchResult *fetchResult = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil];
                        NSArray *assets;
                        if (fetchResult.count > 0) {
                            // 某個相冊里面的所有PHAsset對象
                            assets = [self getAllPhotosAssetInAblumCollection:assetCollection ascending:YES ];
                            
                            [allPhots addObjectsFromArray:assets];
                            
                        }
                    }
                }
            }
            /** 最后一張照片為剛剛拍照傳上去的 */
            PHAsset *PHasset = [allPhots lastObject];
            NSString *date = [NSString stringWithFormat:@"%@",PHasset.creationDate];
            
            PhotoModel *model = [[PhotoModel alloc]init];
            model.date= date;
            model.type = [NSString stringWithFormat:@"%ld",PHasset.mediaType];
            /** 自帶異步 */
            [self accessToImageAccordingToTheAsset:PHasset size:CGSizeMake(kMyimageSize * scale,kMyimageSize * scale)  resizeMode:PHImageRequestOptionsResizeModeFast completion:^(UIImage *image, NSDictionary *info) {
                
                model.thumbNailImage = image;
                
                if (self.dataArray.count < 3) {
                    [self.dataArray addObject:model];
                    [self getimageView];
                }else
                {
                    if (_myHud.hidden || _myHud == nil) {
                        _myHud = [JGProgressHUD onlyShowMessage:@"抱歉嘹朗!暫時最多發(fā)布三張控嗜。" withHUDStyle:JGProgressHUDStyleDark inVC:self];
                    }
                }
            }];
        }
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市骡显,隨后出現的幾起案子,更是在濱河造成了極大的恐慌曾掂,老刑警劉巖惫谤,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異珠洗,居然都是意外死亡溜歪,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門许蓖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蝴猪,“玉大人调衰,你說我怎么就攤上這事∽在澹” “怎么了嚎莉?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沛豌。 經常有香客問我趋箩,道長,這世上最難降的妖魔是什么加派? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任叫确,我火速辦了婚禮,結果婚禮上芍锦,老公的妹妹穿的比我還像新娘竹勉。我一直安慰自己,他們只是感情好娄琉,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布次乓。 她就那樣靜靜地躺著,像睡著了一般车胡。 火紅的嫁衣襯著肌膚如雪檬输。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天匈棘,我揣著相機與錄音丧慈,去河邊找鬼。 笑死主卫,一個胖子當著我的面吹牛逃默,可吹牛的內容都是我干的。 我是一名探鬼主播簇搅,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼完域,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瘩将?” 一聲冷哼從身側響起吟税,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎姿现,沒想到半個月后肠仪,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡备典,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年异旧,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片提佣。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡吮蛹,死狀恐怖荤崇,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情潮针,我是刑警寧澤术荤,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站然低,受9級特大地震影響喜每,放射性物質發(fā)生泄漏。R本人自食惡果不足惜雳攘,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一带兜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吨灭,春花似錦刚照、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至吠冤,卻和暖如春浑彰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拯辙。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工郭变, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人涯保。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓诉濒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親夕春。 傳聞我的和親對象是個殘疾皇子未荒,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內容