你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS中讀取照片庫及保留圖片或視頻到照片庫的要點解析

iOS中讀取照片庫及保留圖片或視頻到照片庫的要點解析

編輯:IOS開發綜合

讀取照片庫PhotoLibrary
IOS中假如我們只要一次讀取一張圖片或許一個視頻(或拍一張照片/視頻)的需求,那末我們用 UIImagePickerController 便可以弄定。然則許多時刻我們須要一次性從PhotoLibrary讀取多個照片或許視頻,這時候候我們就須要另辟門路了,好在apple為我們供給了響應的接口。
在開端coding之前我們想要熟悉幾個類:
ALAssetsLibrary:代表全部PhotoLibrary,我們可以生成一個它的實例對象,這個實例對象就相當因而照片庫的句柄。
ALAssetsGroup:照片庫的分組,我們可以經由過程ALAssetsLibrary的實例獲得一切的分組的句柄。
ALAsset:一個ALAsset的實例代表一個資產,也就是一個photo或許video,我們可以經由過程他的實例獲得對應的subnail或許原圖等等。
還須要懂得的一個東東就是blocks,apple在IOS 4.0今後年夜量湧現了這玩藝兒,有應用愈來愈廣的意思,不外這玩藝兒確切好用。關於這玩藝兒的內容我在這裡不多講,存眷我的博客我會細講。
關於本文的需求,我們讀取group和每一個asset都是異步的,然則我們如今用blocks我們可以在一個函數外面弄定。所以blocks確切很便利。
上面直接看代碼吧:

ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc]init];//生成全部photolibrary句柄的實例   
NSMutableArray *mediaArray = [[NSMutableArray alloc]init];//寄存media的數組   
    [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop) {//獲得一切group   
        [group enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop) {//從group外面   
            NSString* assetType = [result valueForProperty:ALAssetPropertyType];   
            if ([assetType isEqualToString:ALAssetTypePhoto]) {   
                NSLog(@"Photo");   
            }else if([assetType isEqualToString:ALAssetTypeVideo]){   
                NSLog(@"Video");   
            }else if([assetType isEqualToString:ALAssetTypeUnknown]){   
                NSLog(@"Unknow AssetType");   
            }   
               
            NSDictionary *assetUrls = [result valueForProperty:ALAssetPropertyURLs];   
            NSUInteger assetCounter = 0;   
            for (NSString *assetURLKey in assetUrls) {   
                NSLog(@"Asset URL %lu = %@",(unsigned long)assetCounter,[assetUrls objectForKey:assetURLKey]);   
            }   
               
            NSLog(@"Representation Size = %lld",[[result defaultRepresentation]size]);   
        }];   
    } failureBlock:^(NSError *error) {   
        NSLog(@"Enumerate the asset groups failed.");   
    }];  

保留圖片或視頻到PhotoLibrary
時文件然後,然後經由過程暫時文件的途徑去轉存到photo library。
我們直接來看響應的API:

// These methods can be used to add photos or videos to the saved photos album. 
 
// With a UIImage, the API user can use -[UIImage CGImage] to get a CGImageRef, and cast -[UIImage imageOrientation] to ALAssetOrientation. 
- (void)writeImageToSavedPhotosAlbum:(CGImageRef)imageRef orientation:(ALAssetOrientation)orientation completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock; 
 
// The API user will have to specify the orientation key in the metadata dictionary to preserve the orientation of the image 
- (void)writeImageToSavedPhotosAlbum:(CGImageRef)imageRef metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_1); 
 
// If there is a conflict between the metadata in the image data and the metadata dictionary, the image data metadata values will be overwritten 
- (void)writeImageDataToSavedPhotosAlbum:(NSData *)imageData metadata:(NSDictionary *)metadata completionBlock:(ALAssetsLibraryWriteImageCompletionBlock)completionBlock __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_1); 
 
- (void)writeVideoAtPathToSavedPhotosAlbum:(NSURL *)videoPathURL completionBlock:(ALAssetsLibraryWriteVideoCompletionBlock)completionBlock; 

前三個都是存圖片的,經由過程參數我們可以發明,第一個應用了我們傳出來的偏向,第二個可以經由過程傳入image的metadata保存image的metadata,前兩個都是把圖片轉成 CGImageRef 再保留,第三個是傳入NSData所以可以完全保存image的信息,同時也有metadata傳出來,假如image自帶的信息與metadata抵觸那metadata會籠罩圖片自己所帶的metadata。
最初一個是存儲視頻的API,可以看到參數是一個NSURL,這個只需穿一個當地暫時文件的file URL 就行了。
存儲圖片依據你的需求選擇恰當的API,好比我們獲得到的是UIImage的實例,那末我們用第一個或許第二個比擬便利,假如我們從當地暫時文件讀取image的數據那末我們直接用第三個就比擬便利。
上面來一段簡略的代碼:

- (void)saveImage:(UIImage*)image{ 
    ALAssetsLibrary *assetsLibrary = [[ALAssetsLibrary alloc]init]; 
    [assetsLibrary writeImageToSavedPhotosAlbum:[image CGImage] orientation:(ALAssetOrientation)image.imageOrientation completionBlock:^(NSURL *assetURL, NSError *error) { 
        if (error) { 
            NSLog(@"Save image fail:%@",error); 
        }else{ 
            NSLog(@"Save image succeed."); 
        } 
    }]; 


保留video就費事點了,你須要先把video寫入當地文件然後,獲得到當地暫時文件的途徑,然後挪用下面的第四個API寫入photo library。
關於寫入暫時文件,我之前寫過一篇關於文件讀寫的文章,可以去看看。
我這裡送上一個把工程資本庫的video寫入photo library的demo,如許你便可以把video導入模仿器了,便利有些時刻測試。
重要代碼以下:

- (void)save:(NSString*)urlString{ 
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
    [library writeVideoAtPathToSavedPhotosAlbum:[NSURL fileURLWithPath:urlString] 
                                completionBlock:^(NSURL *assetURL, NSError *error) { 
                                    if (error) { 
                                        NSLog(@"Save video fail:%@",error); 
                                    } else { 
                                        NSLog(@"Save video succeed."); 
                                    } 
                                }]; 

【iOS中讀取照片庫及保留圖片或視頻到照片庫的要點解析】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved