如何在iPhone上通过照片库获取所选图像的名称?

25

我正在iPhone应用程序中从照片库中选择一张图片。如何检索实际的图像名称。

在.h类中

UIImageView * imageView;

UIButton * choosePhotoBtn;

在 .m 类中

-(IBAction) getPhoto:(id) sender 
{
    UIImagePickerController * picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    if((UIButton *) sender == choosePhotoBtn)
    {
        picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    }
    else 
    { 
        picker.sourceType = UIImagePickerControllerSourceTypeCamera;
    }
    [self presentModalViewController:picker animated:YES];
}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{
    [picker dismissModalViewControllerAnimated:YES];
    imageView.image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
}

我该如何获取图片的实际名称?

我是iPhone新手,请帮帮我。

先感谢您的帮助。


请查看以下链接:https://dev59.com/kVbUa4cB1Zd3GeqPB8ln - PRASAD1240
https://dev59.com/kVbUa4cB1Zd3GeqPB8ln - PRASAD1240
@PRASAD1240,为什么你要发布这个问题之后的问题链接?请至少检查一下问题的日期。 - Sandeep Singh
由于评论比这两个问题都要旧,我认为这没关系。只要这个问题不依赖于版本。 - buddhiv
9个回答

69

在你的文件中导入AssetsLibrary:

#import <AssetsLibrary/AssetsLibrary.h>

而在- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info方法中,

放置

// get the ref url
NSURL *refURL = [info valueForKey:UIImagePickerControllerReferenceURL];

// define the block to call when we get the asset based on the url (below)
ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *imageAsset)
{
    ALAssetRepresentation *imageRep = [imageAsset defaultRepresentation];
    NSLog(@"[imageRep filename] : %@", [imageRep filename]);
};

// get the asset library and fetch the asset based on the ref url (pass in block above)
ALAssetsLibrary* assetslibrary = [[ALAssetsLibrary alloc] init];
[assetslibrary assetForURL:refURL resultBlock:resultblock failureBlock:nil];

所以,在日志中你将获得图像名称。

*不要忘记添加现有框架:AssetsLibrary.framework 步骤:

  1. 在项目导航器中选择你的项目
  2. 选择你的目标
  3. 选择“Build Phases”选项卡
  4. 展开“Link Binaries With Libraries”
  5. 点击“+”按钮
  6. 选择你的框架
  7. (可选) 将添加的框架拖放到“Frameworks”组中

来源: http://www.raywenderlich.com/forums/viewtopic.php?f=2&p=34901 & How to "add existing frameworks" in Xcode 4?


2
在我看来,这是最好的答案。 - Erick Smith
1
比被接受的答案更好,但图片的名称仍然像 IMG_1754.JPG 这样,即使是 Safari 下载的图片也是如此。但这似乎就是它的方式,Image Capture 显示相同的名称。 - Marius Soutier
1
在iOS 9中,已经弃用了警告。相应的方法是fetchAssestsWithLocalIdentifiers:options。 - Husein Behboudi Rad

9
如果您正在构建针对iOS 9+的目标应用程序,您将会看到一堆关于ALAssetsLibrary的弃用警告,例如:
“'assetForURL(_:resultBlock:failureBlock:)'在iOS 9.0中已弃用:请改用来自Photos框架的fetchAssetsWithLocalIdentifiers:options:使用本地标识符获取资源(或者使用fetchAssetsWithALAssetURLs:options:)来查找以前已知的ALAssetPropertyAssetURL的PHAssets。”
如警告所述,您应该使用PHAsset。例如,在使用Swift 2.x时,您需要先在文件中添加“import Photos”。然后,在didFinishPickingMediaWithInfo UIImagePickerControllerDelegate方法中使用fetchAssetsWithALAssetURLs来获取文件名:
if let imageURL = info[UIImagePickerControllerReferenceURL] as? NSURL {
    let result = PHAsset.fetchAssetsWithALAssetURLs([imageURL], options: nil)
    let filename = result.firstObject?.filename ?? ""
}

这将会把filename设置为类似于"IMG_0007.JPG"的东西。

1
你能否添加一个Objective-C的翻译? - Max von Hippel
PHAsset在Swift 3中没有filename成员。 - rd_
1
试试这个: let fileName = result.firstObject?.value(forKey: "filename") as? String ?? "未知" - parag
1
使用这段代码无法在iOS 11.0中获取文件名。每次都返回nil。有什么解决办法吗? - User558

6

简单的 Swift 实现:

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

    if let referenceUrl = info[UIImagePickerControllerReferenceURL] as? NSURL {

        ALAssetsLibrary().assetForURL(referenceUrl, resultBlock: { asset in

            let fileName = asset.defaultRepresentation().filename()
            //do whatever with your file name

            }, failureBlock: nil)
        }
    }
}

记住要导入AssetsLibrary库。

2
XCode 表示 ALAssetsLibrary 已经过时,请使用 PHPhotoLibrary 代替。 - zulkarnain shah
对于Swift来说,现在是“import Photos”。 - colinwong

5
在Objective C中,使用Photos框架并导入Photos / Photos.h。
然后,在您的imagePickerController函数中添加以下内容,以从照片库获取图像的文件名。
NSURL *refURL = [info valueForKey:UIImagePickerControllerReferenceURL];
PHFetchResult *result = [PHAsset fetchAssetsWithALAssetURLs:@[refURL] options:nil];
NSString *filename = [[result firstObject] filename];

2
尽管您可以检索最后的路径组件并像文件名一样使用它,但不建议这样做。这些文件名是由系统分配的,供iTunes在同步时理解,不适合程序员访问,因为它们可能会在将来的同步中被其他图像替换。
一个好的解决方法是在从图库选择图片时将当前日期分配为文件名。您可以将其保存在文档或库目录中,并使用映射PList文件将图像映射到其文件名。
另外,您还可以分配唯一的数字作为文件名,并使用这些值访问图像。

1

Objective C 实现适用于 iOS 10。ALAssetsLibrary 已经被弃用,因此您应该使用 PHAsset:

-(void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{

    NSURL *imageURL = [info valueForKey:UIImagePickerControllerReferenceURL];
    PHAsset *phAsset = [[PHAsset fetchAssetsWithALAssetURLs:@[imageURL] options:nil] lastObject];
    NSString *imageName = [phAsset valueForKey:@"filename"];

    UIImage *photo = [info valueForKey:UIImagePickerControllerOriginalImage];

    NSLog(@"Picked image: %@ width: %f x height: %f",imageName, photo.size.width, photo.size.height);

    [picker dismissViewControllerAnimated:YES completion:nil];
}

如何导入PHAsset? - kemdo

0

0
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any])
{
    let imageUrl          = info[UIImagePickerControllerReferenceURL] as! NSURL
    let imageName         = imageUrl.lastPathComponent
    let documentDirectory = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
    let photoURL          = NSURL(fileURLWithPath: documentDirectory)
    let localPath         = photoURL.appendingPathComponent(imageName!)
    let image             = info[UIImagePickerControllerOriginalImage]as! UIImage
    let data              = UIImagePNGRepresentation(image)

    do
    {
        try data?.write(to: localPath!, options: Data.WritingOptions.atomic)
    }
    catch
    {
        // Catch exception here and act accordingly
    }

    self.dismiss(animated: true, completion: nil);
}

1
请添加一些代码行,解释您的代码如何回答问题。 - Yannis

0
 var fileName: String = "Attachment"

 if let imageURL = info[UIImagePickerControllerReferenceURL] as? URL {

    let assets = PHAsset.fetchAssets(withALAssetURLs: [imageURL], options: nil)
    let assetResource = PHAssetResource.assetResources(for: assets.firstObject!)
    fileName = assetResource.first?.originalFilename ?? "Attachment"
 }
 print(fileName)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接