如何使用 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 获取所有相册的列表