如何使用 Photos API 在 iOS 8.0 中检索照片扩展名 (jpg/png)?

Posted

技术标签:

【中文标题】如何使用 Photos API 在 iOS 8.0 中检索照片扩展名 (jpg/png)?【英文标题】:How to retrieve photo extension (jpg/png) in iOS 8.0 using Photos API? 【发布时间】:2014-09-18 18:07:10 【问题描述】:

我正在尝试使用 ios 8 中的新照片 API 获取照片的文件扩展名,但直到现在还没有找到这样做的方法。在 iOS 8.0 之前,我会使用 ALAssetRepresentation 来获取文件扩展名,例如:

// Get asset representation from asset
ALAssetRepresentation *assetRepresentation = [asset defaultRepresentation];

// Extract file extension from the original file name
NSString* fileExt = [[assetRepresentation filename] pathExtension];

现在有什么方法可以获取照片的文件扩展名吗? PS:我正在使用新的照片 API,因为我需要访问我的照片应用程序中的所有照片,而 ALassetsLibrary 只允许访问“最近添加”的照片。

【问题讨论】:

【参考方案1】:

我知道了。

[[PHImageManager defaultManager] requestImageDataForAsset:asset options:imageRequestOptions resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) 

        NSLog(@"info - %@", info);
    ];

PHImageFileDataKey = <PLXPCShMemData: 0x179ab6d0> bufferLength=1384448 dataLength=1384448;
PHImageFileOrientationKey = 1;
PHImageFileSandboxExtensionTokenKey = "c05e608acaf0bb212086ed2d512ccc97ea720ac3;00000000;00000000;0000001a;com.apple.app-sandbox.read;00000001;01000003;0000000000030b8c;/private/var/mobile/Media/DCIM/102APPLE/IMG_2607.JPG";
PHImageFileURLKey = "file:///var/mobile/Media/DCIM/102APPLE/IMG_2607.JPG";
PHImageFileUTIKey = "public.jpeg";
PHImageResultDeliveredImageFormatKey = 9999;
PHImageResultIsDegradedKey = 0;
PHImageResultIsInCloudKey = 0;
PHImageResultIsPlaceholderKey = 0;
PHImageResultWantedImageFormatKey = 9999;

【讨论】:

你知道我们怎样才能得到相同的视频或音频吗? 可以检查-requestPlayerItemForVideo方法 @GarimaSrivastava 您实际上可以使用相同的方法来获取视频的信息,只是不会传回所有相同的对象! @alex 并非所有上述密钥都记录在公共 API 中或出现在公共 API 中。如果 Apple 决定或删除或重命名它们,我只是担心现在使用它们可能会在将来破坏它们。 此调用需要网络访问来确定云中项目的 UTI。有什么办法吗?似乎照片框架在下载之前不知道云中的图像是什么格式,如果您只想从库中获取 GIF,那是相当不理想的!【参考方案2】:

这是一种方法:

PHImageRequestOptions * imageRequestOptions = [[PHImageRequestOptions alloc] init];
imageRequestOptions.synchronous = YES;

[[PHImageManager defaultManager]
 requestImageForAsset:asset
 targetSize:CGSizeMake(2048, 2048)
 contentMode:PHImageContentModeAspectFit
 options:imageRequestOptions
 resultHandler:^(UIImage *result, NSDictionary *info) 
 ];

文件名包含在 info.例如:

PHImageFileURLKey = "file:///var/mobile/Media/DCIM/100APPLE/IMG_0066.JPG";

【讨论】:

info 中没有这样的键。它们是:PHImageFileOrientationKey = 0; PHImageResultDeliveredImageFormatKey = 4031; PHImageResultIsDegradedKey = 0; PHImageResultWantedImageFormatKey = 4031; 这是一个有效的答案。尝试对 targetSize 使用原始尺寸或最大尺寸。 此调用需要网络访问来确定云中项目的 UTI。有什么办法吗?似乎照片框架在下载之前不知道云中的图像是什么格式,如果您只想从库中获取 GIF,那是相当不理想的! 对于使用 PHImageFileURLKey 的视频,影片资产的文件名不正确,最后 .jpg 上的标签而不是 .MOV 使用 requestAVAssetForVideo 返回正确的文件名,但它嵌入在 PHImageFileSandboxExtensionTokenKey 中,看起来像“ f24525397a8e061d41adb973502e7574eaf07390; 00000000; 00000000; 000000000000001b; com.apple.avasset.read仅; 00000001; 01000004; 0000000000fdce91; /用户/用户名/库/开发者/ coresimulator /装置/ 7630c944-177a-4899-b5ac-7a52f30b0fff /数据/媒体/dcim/100apple/img_0006.mov”。不那么容易提取【参考方案3】:

**imageManager.requestImageDataForAsset((images[indexPath.row] as PHAsset), options:PHImageRequestOptions(), resultHandler: imagedata,dataUTI,Orientation,info in

var str:String=((((info as Dictionary)["PHImageFileURLKey"])! as NSURL).lastPathComponent as String) cell.imageName.text=str as String**

【讨论】:

【参考方案4】:

这些也是从照片中选择原始文件名的简单方法

PHAsset *asset; // Init this object with your PHAsset object 

//and then use below line 
NSLog(@"asset ext : %@",[[asset valueForKey:@"filename"] pathExtension]);

【讨论】:

以上是关于如何使用 Photos API 在 iOS 8.0 中检索照片扩展名 (jpg/png)?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Photos 框架从 iOS 上的相机胶卷中获取最新照片?

PHAsset,如何在应用重启后检索特定的 PHAsset 对象(ios8 Photos)

如何使用 UIPageViewController 实现像 iOS Photos 应用一样的照片滑动?

iOS 8 Photos 框架:使用 iOS8 获取所有相册的列表

在 iOS 中访问 Photos.sqlite 以检索照片元数据

使用 Swift (iOS) 和 Photos 框架保存自定义图像的元数据