本文介紹了iOS中擷取系統相簿中的圖片,在很多應用中都能用到,可以擷取單張圖片,也可以同時擷取多張圖片,廢話不多說了,看下面吧。
一.擷取單張圖片
思路:
1.利用UIImagePickerController可以從系統內建的App(照片\相機)中獲得圖片
2.設定代理,遵守代理協議
注意這個UIImagePickerController類比較特殊,需要遵守兩個代理協議
@interface ViewController () <UIImagePickerControllerDelegate, UINavigationControllerDelegate>
3.實現代理的方法didFinishPickingMediaWithInfo
- (void)getImageFromIpc{ // 1.判斷相簿是否可以開啟 if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) return; // 2. 建立圖片選擇控制器 UIImagePickerController *ipc = [[UIImagePickerController alloc] init]; /** typedef NS_ENUM(NSInteger, UIImagePickerControllerSourceType) { UIImagePickerControllerSourceTypePhotoLibrary, // 相簿 UIImagePickerControllerSourceTypeCamera, // 用相機拍攝擷取 UIImagePickerControllerSourceTypeSavedPhotosAlbum // 相簿 } */ // 3. 設定開啟照片相簿類型(顯示所有相簿) ipc.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; // ipc.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; // 照相機 // ipc.sourceType = UIImagePickerControllerSourceTypeCamera; // 4.設定代理 ipc.delegate = self; // 5.modal出這個控制器 [self presentViewController:ipc animated:YES completion:nil];}#pragma mark -- <UIImagePickerControllerDelegate>--// 擷取圖片後的操作- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{ // 銷毀控制器 [picker dismissViewControllerAnimated:YES completion:nil]; // 設定圖片 self.imageView.image = info[UIImagePickerControllerOriginalImage];}
二.擷取多張圖片
思路:
- 匯入標頭檔#import <Photos/Photos.h>
- PHAsset : 一個資源, 比如一張圖片\一段視頻
- PHAssetCollection : 一個相簿
- PHImageManager 圖片管理者,是單例,發送請求才能從asset擷取圖片
- PHImageRequestOptions圖片請求選項
- 注意:這個類是iOS8開始推廣,iOS9開始廢棄之前的方法
- 系統適配iOS8之前,用下面這個庫裡面的API
#import <AssetsLibrary/AssetsLibrary.h>
1.獲得所有相簿的原圖
- (void)getOriginalImages{ // 獲得所有的自訂相簿 PHFetchResult<PHAssetCollection *> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; // 遍曆所有的自訂相簿 for (PHAssetCollection *assetCollection in assetCollections) { [self enumerateAssetsInAssetCollection:assetCollection original:YES]; } // 獲得相機菲林 PHAssetCollection *cameraRoll = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil].lastObject; // 遍曆相機菲林,擷取大圖 [self enumerateAssetsInAssetCollection:cameraRoll original:YES];}
2.獲得所有相簿中的縮圖
- (void)getThumbnailImages{ // 獲得所有的自訂相簿 PHFetchResult<PHAssetCollection *> *assetCollections = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil]; // 遍曆所有的自訂相簿 for (PHAssetCollection *assetCollection in assetCollections) { [self enumerateAssetsInAssetCollection:assetCollection original:NO]; } // 獲得相機菲林 PHAssetCollection *cameraRoll = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeSmartAlbumUserLibrary options:nil].lastObject; [self enumerateAssetsInAssetCollection:cameraRoll original:NO];}
3.遍曆相簿
/** * 遍曆相簿中的所有圖片 * @param assetCollection 相簿 * @param original 是否要原圖 */- (void)enumerateAssetsInAssetCollection:(PHAssetCollection *)assetCollection original:(BOOL)original{ NSLog(@"相簿名:%@", assetCollection.localizedTitle); PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; // 同步獲得圖片, 只會返回1張圖片 options.synchronous = YES; // 獲得某個相簿中的所有PHAsset對象 PHFetchResult<PHAsset *> *assets = [PHAsset fetchAssetsInAssetCollection:assetCollection options:nil]; for (PHAsset *asset in assets) { // 是否要原圖 CGSize size = original ? CGSizeMake(asset.pixelWidth, asset.pixelHeight) : CGSizeZero; // 從asset中獲得圖片 [[PHImageManager defaultManager] requestImageForAsset:asset targetSize:size contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage * _Nullable result, NSDictionary * _Nullable info) { NSLog(@"%@", result); }]; }}
以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支援雲棲社區。