获取 PHAsset 的本地文件路径
Posted
技术标签:
【中文标题】获取 PHAsset 的本地文件路径【英文标题】:Get the local file path of a PHAsset 【发布时间】:2015-02-04 17:39:35 【问题描述】:我希望我的用户能够在 Instagram 上分享一张照片,我需要获取该照片的本地文件目录。
但是,我将图像作为 PHAsset 获取(而不是 ALAsset,所有其他答案似乎都涵盖了这个主题)。
查看 PHAsset 文档,我没有看到“本地目录”变量。
您知道如何使用新的 ios8 Photo 框架从用户相机胶卷中获取照片的路径吗?
这是我在用户相册中加载最后一张图片的代码
public func loadLastPhotoIntoGalleryIcon()
if(phphotoLibrary.authorizationStatus() != PHAuthorizationStatus.Authorized)
return
var fetchOptions:PHFetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key: "creationDate", ascending: false)]
var fetchResult:PHFetchResult = PHAsset.fetchAssetsWithMediaType(PHAssetMediaType.Image, options: fetchOptions)
var lastAsset:PHAsset = fetchResult.firstObject as PHAsset
var options:PHImageRequestOptions = PHImageRequestOptions()
options.version = PHImageRequestOptionsVersion.Current
PHImageManager.defaultManager().requestImageForAsset(lastAsset, targetSize: _view.getGalleryIconSize(), contentMode: PHImageContentMode.AspectFill, options: options)
(result, objects) -> Void in
self._view.setGalleryIcon(result)
【问题讨论】:
【参考方案1】:使用内容编辑输入:
asset.requestContentEditingInput(with: PHContentEditingInputRequestOptions()) (input, _) in
let url = input.fullSizeImageURL
确保资产为PHAssetMediaType.Image
,否则在解压可选组件时可能会崩溃。
【讨论】:
input.fullSizeImageURL 无法在设备上加载图像,尽管它正在模拟器上运行【参考方案2】:func getImagesFromAsset(anAsset: PHAsset)
PHImageManager.default().requestImage(for: anAsset, targetSize: CGSize(width: 600, height: 600), contentMode: .aspectFill, options: nil, resultHandler: (image, info) in
//resultHandler have info ([AnyHashable: Any])
print(info!["PHImageFileURLKey"])
if let img = image
self.imgv.image = img
)
这可能会有所帮助 将此粘贴到您的 CellForRowAt 方法中并在参数中传递 PHAsset。
【讨论】:
但由于苹果隐私政策,您将无法访问目录【参考方案3】:PHAsset *asset = YOUR_ASSET;
PHImageManager *manager = [PHImageManager defaultManager];
PHImageRequestOptions *options = [PHImageRequestOptions new];
options.synchronous = YES;
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
options.resizeMode = PHImageRequestOptionsResizeModeNone;
options.networkAccessAllowed = NO;
[manager requestImageForAsset:YOUR_ASSET targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeDefault options:options resultHandler:^(UIImage *resultImage, NSDictionary *info)
NSURL *filePath = [info valueForKeyPath:@"PHImageFileURLKey"]
];
【讨论】:
【参考方案4】:资产=PHAsset *资产
[asset requestContentEditingInputWithOptions:[PHContentEditingInputRequestOptions new] completionHandler:^(PHContentEditingInput *contentEditingInput, NSDictionary *info)
NSURL *imageURL = contentEditingInput.fullSizeImageURL;
];
确保您的 PHAsset 应该是图像类型 检查这个 PHAssetMediaType.Image 应该是真的
【讨论】:
【参考方案5】:是的,您必须将 PHAsset 转换为 ALAsset,然后您才能从 ALAsset 中获取 url。 像这样的东西: PHImageManager.defaultManager().requestAVAssetForVideo....
【讨论】:
【参考方案6】:请求资产信息以开始内容编辑会话。
- (PHContentEditingInputRequestID)requestContentEditingInputWithOptions:(PHContentEditingInputRequestOptions *)options
completionHandler:(void (^)(PHContentEditingInput *contentEditingInput, NSDictionary *info))completionHandler;
包含全尺寸图像数据的文件的 URL。
@property(readonly, copy) NSURL *fullSizeImageURL;
【讨论】:
以上是关于获取 PHAsset 的本地文件路径的主要内容,如果未能解决你的问题,请参考以下文章
swift两种获取相册资源PHAsset的路径的方法(绝对路径)