메신저는 PHAssets
을 사용하여 이미지 이름을 가져 오려고합니다. 그러나 파일 이름이나 이미지 이름에 대한 메타 데이터를 찾을 수 없습니다. 파일 이름을 가져 오는 다른 방법이 있습니까? 당신은 이미지 이름을 얻고 싶은 경우에iOS8 포토 프레임 워크 : PHAsset의 이름 (또는 파일 이름)을 얻는 방법?
답변
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"];
}
}];
}
는 도움이되기를 바랍니다.
스위프트의 코드는 당신이 정말 원하는 것은 지속적으로 개체를 식별하는 고유 한 문자열입니다 localIdentifier 인이
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
}
})
처럼 보일 것입니다. here
또 하나 개의 옵션입니다
fetchAssetsWithLocalIdentifiers:options:, fetchAssetCollectionsWithLocalIdentifiers:options:, or fetchCollectionListsWithLocalIdentifiers:options: method.
더 많은 정보를 볼 수 있습니다 : :
사용이 캐릭터 라인을 사용하여 객체를 찾는 것은
[asset valueForKey:@"filename"]
은 "합법"의 이것은 당신이 결정할 것입니다.
PHAsset의 'filename'속성이 없습니다. 어떻게 작동할까요? –
Magic. =] 공개 API에서는 노출되지 않는 개인 소유물입니다. 'filename'이라는 다른 공개 API 속성이 있기 때문에 상대적으로 사용하기 쉽습니다. –
iOS 8에서이 기능이 작동합니까? –
나는 질문은 이미 답을 알지만, 나는 또 다른 옵션을 제공 할 생각 :
extension PHAsset {
var originalFilename: String? {
var fname:String?
if #available(iOS 9.0, *) {
let resources = PHAssetResource.assetResourcesForAsset(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.valueForKey("filename") as? String
}
return fname
}
}
간단한 대답이 자산을 참조 URL이 :
if let asset = PHAsset.fetchAssetsWithALAssetURLs([referenceUrl], options: nil).firstObject as? PHAsset {
PHImageManager.defaultManager().requestImageDataForAsset(asset, options: nil, resultHandler: { _, _, _, info in
if let fileName = (info?["PHImageFileURLKey"] as? NSURL)?.lastPathComponent {
//do sth with file name
}
})
}
을 SWIFT4 : 첫 번째 import Photos
이것은 단지 더러운 해결 방법입니다. 'PHImageFileURLKey'는 문서화되지 않은 키이며 이미지가 편집되면 마지막 경로 구성 요소에이 URL의 고유 이름이 없습니다 (예 : 이미지 필터 포함). – user500
보풀은 항상 file : ///var/mobile/Media/DCIM/###APPLE/IMG_####.JPG가됩니까? 암호를 해독하고 파일 이름을 test.png로 가져 오는 방법이 있습니까? –
그리고 이미지의 이름을 바꾸지 못하게 할 방법이 있습니까? 내 장치로 이미지를 전송하는 경우 컴퓨터에있는 것과 동일한 파일 이름을 유지하고 싶습니다. 컴퓨터에서 파일을 전송할 때와 동일한 파일 이름을 유지 한 다음 응용 프로그램으로 가져 오십시오. 그 이후로 만들 수 있습니까? –