iOS Photos Framework 数据 UTI 或图像在云端时的格式
iOS Photos Framework data UTI or format when image is in cloud
我正在升级我的 GIF 应用程序以使用 iOS 8 照片框架,基本上我想在他们的照片库中找到所有用户的 GIF 并显示它们。在 iCloud 照片库 'optimise storage' 发挥作用之前与 ALAssetLibrary
配合得很好,因为现在用户可以在云中拥有大量图像,因此需要使用照片框架来获取它们不幸的是,似乎在从云端下载之前,您无法判断 PHAsset
是 GIF 还是普通的静态图像……当您的网络连接为零或网络连接不良时,这将使我的应用程序变得非常糟糕。 ..
这是我用来尝试仅获取 GIF 的代码:
PHFetchOptions* fetchOptions = [[PHFetchOptions alloc] init];
fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
PHFetchResult *allPhotosResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options: fetchOptions];
// Get assets from the PHFetchResult object
[allPhotosResult enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
//NSLog(@"asset %@", asset);
PHImageRequestOptions* options = [[PHImageRequestOptions alloc] init];
options.synchronous = YES;
options.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat;
[imageManager requestImageDataForAsset: asset options: options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
// when the item is in the cloud dataUTI is nil so I can't check what format it is...
}
信息字典包含一些未记录的键:
PHImageResultDeliveredImageFormatKey
PHImageResultWantedImageFormat
我见过的值分别为 9999、9998 和 40xx。但它们似乎与图像是否为 GIF 没有特别关联,因此必须完全与其他内容相关...
有什么想法吗??
使用这个选项!
PHImageRequestOptions *options = [[PHImageRequestOptions alloc]init];
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
options.networkAccessAllowed = YES;
看起来如果不从云端下载图像并进行检查就无法解决这个问题。我正在更新我的应用程序来执行此操作,但要记住每个图像的类型与 PHAsset
的 localIdentifier
相对应,这样它只需要执行一次。
如果您采用这种方法,您可能还想避免 PHAsset
代表连拍、HDR 或全景图像的图片,因为它们不会是 gif(显然也排除视频!)
有一个解决方案,但仅适用于 IOS 9,他们添加了一个新结构
typedef NS_OPTIONS(NSUInteger, PHAssetSourceType) {
PHAssetSourceTypeNone = 0,
PHAssetSourceTypeUserLibrary = (1UL << 0),
PHAssetSourceTypeCloudShared = (1UL << 1),
PHAssetSourceTypeiTunesSynced = (1UL << 2),
} NS_AVAILABLE_IOS(9_0);
还有
Added PHAssetResourceType [enum]
Added PHAssetResourceType.AdjustmentBasePhoto
Added PHAssetResourceType.AdjustmentData
Added PHAssetResourceType.AlternatePhoto
Added PHAssetResourceType.Audio
Added PHAssetResourceType.FullSizePhoto
Added PHAssetResourceType.FullSizeVideo
Added PHAssetResourceType.Photo
Added PHAssetResourceType.Video
我正在升级我的 GIF 应用程序以使用 iOS 8 照片框架,基本上我想在他们的照片库中找到所有用户的 GIF 并显示它们。在 iCloud 照片库 'optimise storage' 发挥作用之前与 ALAssetLibrary
配合得很好,因为现在用户可以在云中拥有大量图像,因此需要使用照片框架来获取它们不幸的是,似乎在从云端下载之前,您无法判断 PHAsset
是 GIF 还是普通的静态图像……当您的网络连接为零或网络连接不良时,这将使我的应用程序变得非常糟糕。 ..
这是我用来尝试仅获取 GIF 的代码:
PHFetchOptions* fetchOptions = [[PHFetchOptions alloc] init];
fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
PHFetchResult *allPhotosResult = [PHAsset fetchAssetsWithMediaType:PHAssetMediaTypeImage options: fetchOptions];
// Get assets from the PHFetchResult object
[allPhotosResult enumerateObjectsUsingBlock:^(PHAsset *asset, NSUInteger idx, BOOL *stop) {
//NSLog(@"asset %@", asset);
PHImageRequestOptions* options = [[PHImageRequestOptions alloc] init];
options.synchronous = YES;
options.deliveryMode = PHImageRequestOptionsDeliveryModeFastFormat;
[imageManager requestImageDataForAsset: asset options: options resultHandler:^(NSData *imageData, NSString *dataUTI, UIImageOrientation orientation, NSDictionary *info) {
// when the item is in the cloud dataUTI is nil so I can't check what format it is...
}
信息字典包含一些未记录的键:
PHImageResultDeliveredImageFormatKey
PHImageResultWantedImageFormat
我见过的值分别为 9999、9998 和 40xx。但它们似乎与图像是否为 GIF 没有特别关联,因此必须完全与其他内容相关...
有什么想法吗??
使用这个选项!
PHImageRequestOptions *options = [[PHImageRequestOptions alloc]init];
options.deliveryMode = PHImageRequestOptionsDeliveryModeHighQualityFormat;
options.networkAccessAllowed = YES;
看起来如果不从云端下载图像并进行检查就无法解决这个问题。我正在更新我的应用程序来执行此操作,但要记住每个图像的类型与 PHAsset
的 localIdentifier
相对应,这样它只需要执行一次。
如果您采用这种方法,您可能还想避免 PHAsset
代表连拍、HDR 或全景图像的图片,因为它们不会是 gif(显然也排除视频!)
有一个解决方案,但仅适用于 IOS 9,他们添加了一个新结构
typedef NS_OPTIONS(NSUInteger, PHAssetSourceType) {
PHAssetSourceTypeNone = 0,
PHAssetSourceTypeUserLibrary = (1UL << 0),
PHAssetSourceTypeCloudShared = (1UL << 1),
PHAssetSourceTypeiTunesSynced = (1UL << 2),
} NS_AVAILABLE_IOS(9_0);
还有
Added PHAssetResourceType [enum]
Added PHAssetResourceType.AdjustmentBasePhoto
Added PHAssetResourceType.AdjustmentData
Added PHAssetResourceType.AlternatePhoto
Added PHAssetResourceType.Audio
Added PHAssetResourceType.FullSizePhoto
Added PHAssetResourceType.FullSizeVideo
Added PHAssetResourceType.Photo
Added PHAssetResourceType.Video