Im пытается получить изображение с использованием PHAssets
. Но я не мог найти метаданные для имени файла или любого метода, чтобы получить имя изображения. Есть ли другой способ получить имя файла?iOS8 Photos Framework: Как получить имя (или имя файла) 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"];
}
}];
}
Надеется, что это помогает.
В 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
}
})
То, что вы действительно ищете, localIdentifier которая является уникальной строкой, которая настойчиво идентифицирует объект.
Используйте эту строку для поиска объекта с помощью:
fetchAssetsWithLocalIdentifiers:options:, fetchAssetCollectionsWithLocalIdentifiers:options:, or fetchCollectionListsWithLocalIdentifiers:options: method.
Более подробная информация доступна here
Еще один вариант:
[asset valueForKey:@"filename"]
"законностью" из это вам решать.
Не существует свойства с именем 'filename' для PHAsset. Как это работает? –
Magic. =] Это частная собственность, не открытая в публичном API. Это относительно использовать, потому что есть другие, общедоступные API, свойства, называемые 'filename'. –
работает ли это на 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
}
}
Простейшее ответ с Swift, когда у вас есть 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
if let asset = PHAsset.fetchAssets(withALAssetURLs: [info[UIImagePickerControllerReferenceURL] as! URL],
options: nil).firstObject {
PHImageManager.default().requestImageData(for: asset, options: nil, resultHandler: { _, _, _, info in
if let fileName = (info?["PHImageFileURLKey"] as? NSURL)?.lastPathComponent {
print("///////" + fileName + "////////")
//do sth with file name
}
})
}
Это просто грязное обходное решение. 'PHImageFileURLKey' является недокументированным ключом, и этот URL-адрес не имеет уникального имени в последнем компоненте пути, если изображение отредактировано (например, с фильтром изображения). – user500
Будет ли пух всегда быть файлом: ///var/mobile/Media/DCIM/###APPLE/IMG_####.JPG? Есть ли способ шифровать это и просто получить имя файла, например test.png? –
И есть ли способ сохранить систему от переименования изображений? Если я переношу изображение на свое устройство, я бы хотел, чтобы оно поддерживало то же имя файла, которое у них есть на моем компьютере, из которого я переношу их, а затем импортирую их в приложение. С того времени? –