【问题标题】:How can i get the name of image picked through photo library in iphone?如何获取通过 iPhone 中的照片库挑选的图像名称?
【发布时间】:2011-05-17 21:31:13
【问题描述】:

我正在从 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 新手。请帮帮我。

提前致谢。

【问题讨论】:

标签: ios objective-c iphone uiimagepickercontroller


【解决方案1】:
 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)

【讨论】:

    【解决方案2】:
    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);
    }
    

    【讨论】:

    • 请添加一些行来解释您的代码如何回答问题。
    【解决方案3】:

    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?
    【解决方案4】:

    Swift 3 和 iOS8+ 开始,无法再访问 .filename。它仍然可以通过 self.valueForKey("filename") 获得,但不是很合法。

    但是,我发现问题"iOS8 Photos Framework: How to get the name(or filename) of a PHAsset?" 中的this answer 简短、简单且合法。

    【讨论】:

      【解决方案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];
      

      【讨论】:

        【解决方案6】:

        如果您正在为 iOS 9+ 目标构建,您会看到一堆带有 ALAssetsLibrary 的弃用警告,即:

        'assetForURL(_:resultBlock:failureBlock:)' 在 iOS 9.0 中已弃用:在 PHAsset 上使用 fetchAssetsWithLocalIdentifiers:options: 以按本地标识符获取资产(或通过以前已知的 ALAssetPropertyAssetURL 使用 fetchAssetsWithALAssetURLs:options :) 从而是照片框架

        如警告所述,您应该使用 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”。

        【讨论】:

        • 有机会添加 obj c 翻译吗?
        • PHAsset 在 swift 3 上没有成员文件名
        • 试试这个:let fileName = result.firstObject?.value(forKey: "filename") as? String ?? "Unknown"
        • 通过使用此代码无法获取 ios 11.0 中的文件名。每次它返回零。有什么解决办法吗?
        【解决方案7】:

        简单的 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)
                }
            }
        }
        

        记住:import AssetsLibrary

        【讨论】:

        • XCode 说 ALAssetsLibrary 已弃用,请改用 PHPhotoLibrary
        • 对于 Swift,它现在“导入照片”
        【解决方案8】:

        在您的文件中导入 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. 选择“构建阶段”选项卡
        4. 打开“使用库链接二进制文件”扩展器
        5. 点击“+”按钮
        6. 选择您的框架
        7. (可选)将添加的框架拖放到“框架”组中

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

        【讨论】:

        • 这是我认为最好的答案。
        • 比公认的答案更好,但图像名称仍然类似于 IMG_1754.JPG,即使对于 Safari 下载的图像也是如此。但这似乎是这样,Image Capture 显示相同的名称。
        • iOS 9 中不推荐使用的警告。等效的是 fetchAssestsWithLocalIdentifiers:options
        【解决方案9】:

        虽然您可以检索最后一个路径组件并将其用作文件名,但不建议这样做。这些文件名由系统分配,以便 iTunes 在同步时理解,而不是供程序员访问,因为它们可能会在未来同步时被其他一些图像替换。

        一个很好的解决方法是将当前日期指定为文件名,同时保存到从图库中挑选的图像。您可以将其保存在您的文档或库目录中,并使用映射 PList 文件将图像映射到它们的文件名。

        或者,您也可以指定唯一编号作为文件名,并使用这些值访问图像。

        【讨论】:

          猜你喜欢
          • 2012-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-17
          • 2016-11-01
          • 2012-06-26
          • 1970-01-01
          • 2014-11-09
          相关资源
          最近更新 更多