獲取圖片名稱,網上大多數就一種獲取相冊圖片名稱,要么就是方法太舊。最近有這個需求,相冊和拍照圖片名稱都要獲取。
**** 注意一下,獲取相冊圖片名稱,用imagePickerController在高于iOS14上的系統獲取可能會出現獲取不到的問題,這個類已經老了。可以使用PHPicker
一、要求
1、獲取相冊圖片名稱
2、獲取拍照圖片名稱
二、實現
本次記錄的方法是調用系統相冊、相機后,獲取圖片名稱的實現
相冊、相機調用就不寫上去了。直接上獲取名稱的代碼
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info {
? ? ? ? if (picker.sourceType == UIImagePickerControllerSourceTypeCamera) {
? ? ? ? ? ? UIImage *image = [[info objectForKey:UIImagePickerControllerOriginalImage] fixOrientation];
? ? ? ? ? ? //相機拍攝獲取
? ? ? ? ? ? if(@available(iOS9.0, *)) {
? ? ? ? ? ? ? ? //唯一標識,可以用于圖片資源獲取
? ? ? ? ? ? ? ? __blockNSString*createdAssetID =nil;
? ? ? ? ? ? ? ?XZWeakSelf(weakSelf);
? ? ? ? ? ? ? ? [[PHPhotoLibrary sharedPhotoLibrary]performChanges:^{
? ? ? ? ? ? ? ? ? ? PHAssetChangeRequest *changeAssetRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
? ? ? ? ? ? ? ? ? ? createdAssetID = changeAssetRequest.placeholderForCreatedAsset.localIdentifier;
? ? ? ? ? ? ? ? }completionHandler:^(BOOLsuccess,NSError*_Nullableerror) {
? ? ? ? ? ? ? ? ? ? //獲取圖片內容信息必須要放在completionHandler后。不然可能拿不到
? ? ? ? ? ? ? ? ? ? PHFetchResult *fetchResult = [PHAsset fetchAssetsWithLocalIdentifiers:@[createdAssetID] options:nil];
? ? ? ? ? ? ? ? ? ? PHAsset*asset = fetchResult.firstObject;
? ? ? ? ? ? ? ? ? ? NSString*filename = [assetvalueForKey:@"filename"];
? ? ? ? ? ? ? ? ? ? if(![NSStringstrNilOrEmpty:filename]) {
//判空
? ? ? ? ? ? ? ? ? ? ? ? [weakSelfp_cameraWithInfo:infofileName:filename];
? ? ? ? ? ? ? ? ? ? }else{
//失敗
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }];
? ? ? ? ? ? }else{
? ? ? ? ? ? ? ? XZWeakSelf(weakSelf);
? ? ? ? ? ? ? ? ALAssetsLibrary *lib = [[ALAssetsLibrary alloc] init];
? ? ? ? ? ? ? ? [libwriteImageToSavedPhotosAlbum:image.CGImage metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) {
? ? ? ? ? ? ? ? ? ? if(error) {
? ? ? ? ? ? ? ? ? ? ? ? NSLog(@"error:%@", error);
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?}else{
? ? ? ? ? ? ? ? ? ? ? ? PHFetchResult*fetchResult = [PHAssetfetchAssetsWithALAssetURLs:@[assetURL]options:nil];
? ? ? ? ? ? ? ? ? ? ? ? PHAsset*asset = fetchResult.firstObject;
? ? ? ? ? ? ? ? ? ? ? ? NSString*filename = [assetvalueForKey:@"filename"];
? ? ? ? ? ? ? ? ? ? ? ? if(![NSStringstrNilOrEmpty:filename]) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? [weakSelfp_cameraWithInfo:infofileName:filename];
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }];
? ? ? ? ? ? }
? ? ? ? }else{
? ? ? ? ? ? //相冊獲取
? ? ? ? ? ? [self p_photoLibraryWithInfo:info];
? ? ? ? }
}
//相冊選擇
- (void)p_photoLibraryWithInfo:(NSDictionary<NSString *,id> *)info{
? ? NSString*imageName =@"";
? ? NSString*imageType =@"";
? ? //給前端壓縮一下圖片Jpeg格式
? ? NSURL *imageUrl = [info valueForKey:UIImagePickerControllerReferenceURL];
? ? if(imageUrl) {
? ? ? ? PHFetchResult *fetchResult = [PHAsset fetchAssetsWithALAssetURLs:@[imageUrl] options:nil];
? ? ? ? PHAsset*asset = fetchResult.firstObject;
? ? ? ? NSString*filename = [assetvalueForKey:@"filename"];
? ? ? ? if(![NSStringstrNilOrEmpty:filename]) {
? ? ? ? ? ? UIImage *image = [[info objectForKey:UIImagePickerControllerOriginalImage] fixOrientation];
? ? ? ? ? ? imageName = [filenamestringByDeletingPathExtension];
? ? ? ? ? ? imageType = [filenamepathExtension];
? ? ? ? ? ? ? ? ? }else{
//失敗
?}
? ? }
}
//相機選擇
- (void)p_cameraWithInfo:(NSDictionary *)infofileName:(NSString*)fileName {
? ? NSString *imageName = [fileName stringByDeletingPathExtension];//名稱
? ? NSString*imageType = [fileName pathExtension];//類型
? ? UIImage *image = [[info objectForKey:UIImagePickerControllerOriginalImage] fixOrientation];
}
更新補充于2022-7-23?
下面補充的是使用系統推薦使用的PHPicker獲取圖片名稱的方法,iOS14以上由于圖片類型增加,有些圖片信息獲取不了,所以用PHPicker獲取。PHPicker初始化方法自行百度下就行,不需要特殊設置。值得一提的是,我這里獲取圖片類型是從NSItemProvider的description里面截取出來的。暫時沒時間研究,測試后發現這樣取也可以,暫時沒發現問題,但是應該有更準確的方法獲取才對。后續有時間再看吧。
#pragma mark- PHPickerViewControllerDelegate
- (void)picker:(PHPickerViewController *)picker didFinishPicking:(NSArray<PHPickerResult *> *)results
API_AVAILABLE(ios(14)){
? ? [pickerdismissViewControllerAnimated:YES completion:nil];
? ? if(results && results.count>0) {
? ? ? ? PHPickerResult*result = results.firstObject;
? ? ? ? NSItemProvider*provider = result.itemProvider;
? ? ? ? if([providercanLoadObjectOfClass:[UIImageclass]]) {
? ? ? ? ? ? [providerloadObjectOfClass:[UIImageclass]completionHandler:^(__kindofid? _Nullableobject,NSError*_Nullableerror) {
//圖片
? ? ? ? ? ? ? ? UIImage*img = (UIImage*)object;
//圖片名稱
? ? ? ? ? ? ? ? NSString*imageName = provider.suggestedName;
? ? ? ? ? ? ? ? NSArray*typeArr = [provider.descriptioncomponentsSeparatedByString:@"."];
? ? ? ? ? ? ? ? NSArray*typeArr1 = [[typeArrlastObject]componentsSeparatedByString:@"\n"];
//圖片類型獲取
? ? ? ? ? ? ? ? NSString*imageType = [[typeArr1firstObject]uppercaseString];
? ? ? ? ? ? }];
? ? ? ? }
? ? }
}