iOS開發-保存圖片到相冊

APP將圖片保存到系統相冊有四種方法,不過前面三種方法卻隱藏了意想不到的坑,先分別介紹下這四種方法吧。

一、使用UIImageWriteToSavedPhotosAlbum函數將圖片保存到相冊

-?(void)saveImage:(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);

}

第一個參數是要保存到相冊的圖片對象

第二個參數是保存完成后回調的目標對象

第三個參數就是保存完成后回調到目標對象的哪個方法中,方法的聲明要如代碼中所示的:

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

第四個參數在保存完成后,會原封不動地傳回到回調方法的contextInfo參數中。

二、使用AssetsLibrary框架中的ALAssetsLibrary類來實現。具體代碼如下:

-?(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:方法實現。其中第一個參數是一個CGImageRef的對象,表示要傳入的圖片。第二個參數是圖片的一些屬性,這里沒有設置所以傳入nil。最后一個completionBlock是保存完成后的回調,在這個回調中可以取到保存后的圖片路徑以及保存失敗時的錯誤信息。

注意:使用該類時需要導入AssetsLibrary.framework。而且該類需要在iOS4.0以上可以使用,但是在iOS9.0之后就不建議使用了,官方建議使用Photos.framework中的PHPhotoLibrary進行代替,也就是下面所說的第三種方法。

三、iOS8.0以后引入了Photos框架,可完全替代AssetsLibrary.framework的方法,Photos框架保存圖片的方法如下:

使用Photos框架的PHPhotoLibrary類來實現保存到相冊功能。代碼如下:

-?(void)saveImage:(UIImage?*)image

{

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

?????????/寫入圖片到相冊

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

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

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

????}];

}

該例子中先調用PHPhotoLibrary類的performChanges:completionHandler:方法,然后在它的changeBlock中,通過PHAssetChangeRequest類的creationRequestForAssetFromImage:方法傳入一個圖片對象即可實現保存到相冊的功能。然后completionHandler中會告訴我們是否操作成功。

四、iOS9.0以后引入了新的保存圖片到相冊的方法,如下:

[[PHPhotoLibrary?sharedPhotoLibrary]?performChanges:^{

[[

PHAssetCreationRequest?creationRequestForAsset]?addResourceWithType:PHAssetResourceTypePhoto?data:imageData?options:nil];

}?

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

if?( ! success ) {

NSLog(?@"Error occurred while saving image to photo library: %@", error );

}

}];

總結:

1、第一種方式最為便捷,傳入UIImage就可以了,也不需要擔心iOS不同版本的問題。

2、第二種方式是iOS4之后加入的,在iOS9后又不推薦使用了。它提供了很直觀的方式來保存圖片,并且也能夠取到保存后相對應的圖片路徑。

3、第三種方式是iOS8之后加入的,它的使用稍微復雜一點,不過它允許進行批量的操作,例如添加、修改、刪除等。

4、第四種方式是iOS9之后加入的,它是在原來iOS8的基礎上給PHAssetChangeRequest添加了一個存取圖片or視頻到相冊的子類PHAssetCreationRequest。重點是經過測試前面三種保存圖片到相冊的方法都會導致圖片被壓縮,只有第四種不會。第四種可以保存原圖,前面三種保存圖片的方式默認會被壓縮。

進階:

1、保存視頻到相冊。上面提到第四種保存圖片到相冊的方法,同樣也可以用來保存視頻,同樣保存如下:

PHAssetResourceCreationOptions *options = [[PHAssetResourceCreationOptions alloc] init];

? ? ? ? ? ? options.shouldMoveFile=NO;

? ? ? ? ? ? PHAssetCreationRequest*assetRequest =?[PHAssetCreationRequest creationRequestForAsset];

? ? ? ? ? ? if(imageModel.type==PhotoTypeMP4) {

? ? ? ? ? ? ? ? [assetRequest addResourceWithType:PHAssetResourceTypeVideo fileURL:[NSURL fileURLWithPath:imageModel.videoPath] options:options];

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? NSData*data = [NSDatadataWithContentsOfFile:imageModel.finalPath];

? ? ? ? ? ? ? ? assetRequest = [PHAssetCreationRequestcreationRequestForAsset];

? ? ? ? ? ? ? ? [assetRequest addResourceWithType:PHAssetResourceTypePhoto data:data options:options];

? ? ? ? ? ? }

2、保存圖片、視頻到自定義相冊

//遍歷相冊查看存不存在

NSString *albumName = @"自定義";

? ? PHFetchResult *result = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];

? ? PHAssetCollection*albumCollection =nil;

? ? for(PHAssetCollection*collectoninresult) {

? ? ? ? if([collecton.localizedTitleisEqualToString:albumName]) {

? ? ? ? ? ? albumCollection = collecton;

? ? ? ? }

? ? }

? ? [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{

? ? ? ? NSMutableArray*assetsArray = [[NSMutableArrayalloc]init];

? ? ? ? for(JPLImageModel*imageModelinimageArray) {

? ? ? ? ? ? PHAssetResourceCreationOptions *options = [[PHAssetResourceCreationOptions alloc] init];

? ? ? ? ? ? options.shouldMoveFile=NO;

? ? ? ? ? ? PHAssetCreationRequest*assetRequest =nil;

? ? ? ? ? ? if(imageModel.type==PhotoTypeMP4) {

? ? ? ? ? ? ? ? assetRequest = [PHAssetCreationRequestcreationRequestForAsset];

? ? ? ? ? ? ? ? [assetRequestaddResourceWithType:PHAssetResourceTypeVideo fileURL:[NSURL fileURLWithPath:imageModel.videoPath] options:options];

? ? ? ? ? ? }else{

? ? ? ? ? ? ? ? NSData*data = [NSDatadataWithContentsOfFile:imageModel.finalPath];

? ? ? ? ? ? ? ? assetRequest = [PHAssetCreationRequestcreationRequestForAsset];

? ? ? ? ? ? ? ? [assetRequestaddResourceWithType:PHAssetResourceTypePhoto data:data options:options];

? ? ? ? ? ? }

? ? ? ? ? ? [assetsArrayaddObject:assetRequest.placeholderForCreatedAsset];

? ? ? ? }

? ? ? ? PHAssetCollectionChangeRequest*collectionRequest =nil;

? ? ? ? if(albumCollection) {//如果存在就將圖片存入該相冊

? ? ? ? ? ? collectionRequest = [PHAssetCollectionChangeRequestchangeRequestForAssetCollection:albumCollection];

? ? ? ? }else{//如果不存在就創建改相冊

? ? ? ? ? ? collectionRequest = [PHAssetCollectionChangeRequest creationRequestForAssetCollectionWithTitle:albumName];

? ? ? ? }

? ? ? ? [collectionRequestaddAssets:assetsArray];

? ? }completionHandler:^(BOOLsuccess,NSError*_Nullableerror) {

? ? }];

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1、設置UILabel行間距 NSMutableAttributedString*attrString=[[NSM...
    iOS祎閱讀 2,202評論 0 0
  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,768評論 0 9
  • 事情的起因還是因為項目需求驅動。折騰了兩天,由于之前沒有UIWebView與JS交互的經歷,并且覺得這次在功能上有...
    嘿我回來了閱讀 289評論 0 0
  • 【2017年最新】? iOS面試題及答案 設計模式是什么? 你知道哪些設計模式,并簡要敘述? 設計模式是一種編碼經...
    紫色冰雨閱讀 623評論 0 1
  • (1)NSManagedObjectContext(被管理的數據上下文) 操作實際內容(操作持久層) 作用:插入數...
    lilinjianshu閱讀 250評論 0 0