iOS8 Photos Framework:如何获取PHAsset的名称(或文件名)?

Pri*_*nka 21 ios phasset

我试图使用图像名称PHAssets.但我找不到文件名元数据或任何获取图像名称的方法.获取文件名有不同的方法吗?

ski*_*kim 36

我知道问题已经得到解答,但我想我会提供另一种选择:

extension PHAsset {

    var originalFilename: String? {

        var fname:String?

        if #available(iOS 9.0, *) {
            let resources = PHAssetResource.assetResources(for: self)
            if let resource = resources.first {
                fname = resource.originalFilename
            }
        }

        if fname == nil {
            // this is an undocumented workaround that works as of iOS 9.1
            fname = self.value(forKey: "filename") as? String
        }

        return fname
    }
}
Run Code Online (Sandbox Code Playgroud)


Eri*_*ana 20

如果您想获取图像名称(例如照片中的最后一张照片的名称),例如IMG_XXX.JPG,您可以尝试这样做:

PHAsset *asset = nil;
PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
PHFetchResult *fetchResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options:fetchOptions];
if (fetchResult != nil && fetchResult.count > 0) {
    // get last photo from Photos
    asset = [fetchResult lastObject];
}

if (asset) {
    // get photo info from this asset
    PHImageRequestOptions * imageRequestOptions = [[PHImageRequestOptions alloc] init];
    imageRequestOptions.synchronous = YES;
    [[PHImageManager defaultManager]
             requestImageDataForAsset:asset
                            options:imageRequestOptions
                      resultHandler:^(NSData *imageData, NSString *dataUTI,
                                      UIImageOrientation orientation, 
                                      NSDictionary *info) 
     {
          NSLog(@"info = %@", info);
          if ([info objectForKey:@"PHImageFileURLKey"]) {
               // path looks like this - 
               // file:///var/mobile/Media/DCIM/###APPLE/IMG_####.JPG
               NSURL *path = [info objectForKey:@"PHImageFileURLKey"];
     }                                            
    }];
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.

在Swift中,代码看起来像这样

PHImageManager.defaultManager().requestImageDataForAsset(asset, options: PHImageRequestOptions(), resultHandler:
{
    (imagedata, dataUTI, orientation, info) in
    if info!.keys.contains(NSString(string: "PHImageFileURLKey"))
    {
        let path = info![NSString(string: "PHImageFileURLKey")] as! NSURL
    }
})
Run Code Online (Sandbox Code Playgroud)

斯威夫特4:

    let fetchResult = PHAsset.fetchAssets(with: .image, options: nil)
    if fetchResult.count > 0 {
        if let asset = fetchResult.firstObject {
            let date = asset.creationDate ?? Date()
            print("Creation date: \(date)")
            PHImageManager.default().requestImageData(for: asset, options: PHImageRequestOptions(),
                resultHandler: { (imagedata, dataUTI, orientation, info) in
                    if let info = info {
                        if info.keys.contains(NSString(string: "PHImageFileURLKey")) {
                            if let path = info[NSString(string: "PHImageFileURLKey")] as? NSURL {
                                print(path)
                            }
                        }
                    }
            })
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 这只是一个肮脏的解决方法.`PHImageFileURLKey`是未记录的密钥,如果编辑图像,该URL在最后一个路径组件中没有唯一的名称(例如,使用图像过滤器). (5认同)

Leo*_*ica 16

还有一个选择是:

[asset valueForKey:@"filename"]
Run Code Online (Sandbox Code Playgroud)

这种"合法性"取决于你自己决定.

  • PHAsset没有名为"filename"的属性.它怎么样? (3认同)

d4R*_*4Rk 11

Swift 4中最简单的iOS 9+解决方案(基于skims答案):

extension PHAsset {
    var originalFilename: String? {
        return PHAssetResource.assetResources(for: self).first?.originalFilename
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 6

对于斯威夫特

asset?.value(forKey: "filename") as? String
Run Code Online (Sandbox Code Playgroud)

对于目标C

[asset valueForKey:@"filename"]
Run Code Online (Sandbox Code Playgroud)