iOS下將照片保存到相冊(cè)的三種方法

iOS下將照片保存到相冊(cè)的三種方法

方法一

使用UIImageWriteToSavedPhotosAlbum函數(shù)將圖片保存到相冊(cè),如:

- (void)loadImageFinished:(UIImage *)image

{

? ? UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), (__bridge void *)self);

}

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo

{

? ? NSLog(@"image = %@, error = %@, contextInfo = %@", image, error, contextInfo);

}

第一個(gè)參數(shù)是要保存到相冊(cè)的圖片對(duì)象

第二個(gè)參數(shù)是保存完成后回調(diào)的目標(biāo)對(duì)象

第三個(gè)參數(shù)就是保存完成后回調(diào)到目標(biāo)對(duì)象的哪個(gè)方法中,方法的聲明要如代碼中所示的:

- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo;

第四個(gè)參數(shù)在保存完成后锅必,會(huì)原封不動(dòng)地傳回到回調(diào)方法的contextInfo參數(shù)中。

方法二

使用AssetsLibrary框架中的ALAssetsLibrary類來實(shí)現(xiàn)汉操。具體代碼如下:

- (void)loadImageFinished:(UIImage *)image

{

? ? __block ALAssetsLibrary *lib = [[ALAssetsLibrary alloc] init];

? ? [lib writeImageToSavedPhotosAlbum:image.CGImage metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {

? ? ? ? NSLog(@"assetURL = %@, error = %@", assetURL, error);

? ? ? ? lib = nil;

? ? }];

}

使用了ALAssetsLibrary類的writeImageToSavedPhotosAlbum:metadata:completionBlock:方法實(shí)現(xiàn)坪蚁。其中第一個(gè)參數(shù)是一個(gè)CGImageRef的對(duì)象,表示要傳入的圖片豹休。第二個(gè)參數(shù)是圖片的一些屬性炊昆,這里沒有設(shè)置所以傳入nil。最后一個(gè)completionBlock是保存完成后的回調(diào)威根,在這個(gè)回調(diào)中可以取到保存后的圖片路徑以及保存失敗時(shí)的錯(cuò)誤信息凤巨。

注意:使用該類時(shí)需要導(dǎo)入AssetsLibrary.framework。而且該類需要在iOS4.0以上可以使用洛搀,但是在iOS9.0之后就被標(biāo)記為過時(shí)方法敢茁。官方建議使用Photos.framework中的PHPhotoLibrary進(jìn)行代替,也就是下面所說的第三種方法留美。

方法三

使用Photos框架的PHPhotoLibrary類來實(shí)現(xiàn)保存到相冊(cè)功能彰檬。代碼如下:

- (void)loadImageFinished:(UIImage *)image

{

? ? [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{

? ? ? ? /寫入圖片到相冊(cè)

? ? ? ? PHAssetChangeRequest *req = [PHAssetChangeRequest creationRequestForAssetFromImage:image];

? ? } completionHandler:^(BOOL success, NSError * _Nullable error) {

? ? ? ? NSLog(@"success = %d, error = %@", success, error);

? ? }];

}

該例子中先調(diào)用PHPhotoLibrary類的performChanges:completionHandler:方法,然后在它的changeBlock中谎砾,通過PHAssetChangeRequest類的creationRequestForAssetFromImage:方法傳入一個(gè)圖片對(duì)象即可實(shí)現(xiàn)保存到相冊(cè)的功能逢倍。然后completionHandler中會(huì)告訴我們是否操作成功。

進(jìn)階使用:得到保存到相冊(cè)的圖片對(duì)象

也許會(huì)有人需要在保存相冊(cè)后得到圖片的PHAsset對(duì)象來進(jìn)行后續(xù)操作(昨天剛好碰到有朋友遇到這樣的問題)景图。那么瓶堕,這里對(duì)上面例子進(jìn)行改進(jìn),在創(chuàng)建PHAssetChangeRequest后將它的placeholderForCreatedAsset屬性的localIdentifier屬性保存到一個(gè)數(shù)組中症歇,等待操作完成后再通過這個(gè)數(shù)組來查找剛剛添加的圖片對(duì)象郎笆。請(qǐng)看下面栗子:

- (void)loadImageFinished:(UIImage *)image

{

? ? NSMutableArray *imageIds = [NSMutableArray array];

? ? ? ? [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{

? ? ? ? ? ? //寫入圖片到相冊(cè)

? ? ? ? ? ? PHAssetChangeRequest *req = [PHAssetChangeRequest creationRequestForAssetFromImage:image];

? ? ? ? ? ? //記錄本地標(biāo)識(shí),等待完成后取到相冊(cè)中的圖片對(duì)象

? ? ? ? ? ? [imageIds addObject:req.placeholderForCreatedAsset.localIdentifier];

? ? ? ? } completionHandler:^(BOOL success, NSError * _Nullable error) {

? ? ? ? ? ? NSLog(@"success = %d, error = %@", success, error);

? ? ? ? ? ? if (success)

? ? ? ? ? ? {

? ? ? ? ? ? ? ? //成功后取相冊(cè)中的圖片對(duì)象

? ? ? ? ? ? ? ? __block PHAsset *imageAsset = nil;

? ? ? ? ? ? ? ? PHFetchResult *result = [PHAsset fetchAssetsWithLocalIdentifiers:imageIds options:nil];

? ? ? ? ? ? ? ? [result enumerateObjectsUsingBlock:^(PHAsset * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {

? ? ? ? ? ? ? ? ? ? imageAsset = obj;

? ? ? ? ? ? ? ? ? ? *stop = YES;

? ? ? ? ? ? ? ? }];

? ? ? ? ? ? ? ? if (imageAsset)

? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? //加載圖片數(shù)據(jù)

? ? ? ? ? ? ? ? ? ? [[PHImageManager defaultManager] requestImageDataForAsset:imageAsset

? ? ? ? ? ? ? ? ? ? ? ? ? options:nil

? ? ? ? ? ? ? ? ? ? ? ? ? resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? NSLog("imageData = %@", imageData);

? ? ? ? ? ? ? ? ? ? ? ? ? }];

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }];

}

總結(jié)

第一種方式是最常用的忘晤,使用起來很方便宛蚓,傳入U(xiǎn)IImage就可以了,也不需要擔(dān)心iOS不同版本的問題设塔。唯一缺點(diǎn)就是無法找到對(duì)應(yīng)添加的圖片凄吏。

第二種方式是iOS4之后加入的,在iOS9后又不推薦使用了。他也提供了很直觀的方式來保存圖片痕钢,并且也能夠取到保存后相對(duì)應(yīng)的圖片路徑图柏。

第三種方式是iOS8之后加入的,他的使用稍微復(fù)雜一點(diǎn)任连,但是它允許進(jìn)行批量的操作蚤吹,例如添加、修改随抠、刪除等裁着。如果要做更近復(fù)雜的操作的話,這種方式是比較推薦的方式拱她。

看到好的二驰,粘貼下來。簡(jiǎn)友幫忙監(jiān)督

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秉沼,一起剝皮案震驚了整個(gè)濱河市桶雀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌唬复,老刑警劉巖背犯,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異盅抚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)倔矾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門妄均,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人哪自,你說我怎么就攤上這事丰包。” “怎么了壤巷?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵邑彪,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我胧华,道長(zhǎng)寄症,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任矩动,我火速辦了婚禮有巧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悲没。我一直安慰自己篮迎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著甜橱,像睡著了一般逊笆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岂傲,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天难裆,我揣著相機(jī)與錄音,去河邊找鬼譬胎。 笑死差牛,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的堰乔。 我是一名探鬼主播偏化,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼镐侯!你這毒婦竟也來了侦讨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤苟翻,失蹤者是張志新(化名)和其女友劉穎韵卤,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體崇猫,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡沈条,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了诅炉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜡歹。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖涕烧,靈堂內(nèi)的尸體忽然破棺而出月而,到底是詐尸還是另有隱情,我是刑警寧澤议纯,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布父款,位于F島的核電站,受9級(jí)特大地震影響瞻凤,放射性物質(zhì)發(fā)生泄漏憨攒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一阀参、第九天 我趴在偏房一處隱蔽的房頂上張望浓恶。 院中可真熱鬧,春花似錦结笨、人聲如沸包晰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伐憾。三九已至勉痴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間树肃,已是汗流浹背蒸矛。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胸嘴,地道東北人雏掠。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像劣像,于是被迫代替她去往敵國(guó)和親乡话。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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