ios - 将使用 UIImagePickerController 拍摄的图像以 HEIC 格式保存到照片卷
问题描述
UIImageWriteToSavedPhotosAlbum()
如果我使用我知道的方法(和)将图像保存到照片卷中,则[PHAssetChangeRequest creationRequestForAssetFromImage:img]
随后选择保存的照片UIImagePickerController
给我一个.jpg
图像。
info[UIImagePickerControllerReferenceURL]
给assets-library://asset/asset.JPG?id=B8B231DC-3A84-4F65-AD5E-D6C431CB5F8B&ext=JPG
和
[((PHAsset*)info[UIImagePickerControllerPHAsset]) valueForKey:@"filename"]
给我@"IMG_5512.JPG"
例如。
但是,如果我使用“相机”应用程序拍摄照片,则选择的照片UIImagePickerController
具有 HEIC 扩展名(假设“高效”设置在“相机”设置中有效)。
那么有什么方便的方法可以以 HEIC 格式保存到相册以响应
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
?
解决方案
感谢马特的评论,我能够解决这个问题。如何将从 UIImagePickerController 获取的图像保存为 HEIF 文件中有一个非常相似的问题?,但不完全相同。
UIImage* img=(UIImage*)info[UIImagePickerControllerOriginalImage];
NSDictionary* meta=(NSDictionary*)info[UIImagePickerControllerMediaMetadata];
CIContext* ctx=[CIContext context];
CIImage* ci=[[CIImage alloc] initWithImage:img options:@{kCIImageProperties:meta}];
NSData* heicData=[ctx HEIFRepresentationOfImage:ci format:kCIFormatRGBA8 colorSpace:ctx.workingColorSpace options:@{}];
NSString* __block newId=nil;
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
PHAssetCreationRequest *request = [PHAssetCreationRequest creationRequestForAsset];
[request addResourceWithType:PHAssetResourceTypePhoto data:heicData options:nil];
newId = request.placeholderForCreatedAsset.localIdentifier;
} completionHandler:^(BOOL success, NSError * _Nullable error) {
if (success) {
PHFetchResult* fr=[PHAsset fetchAssetsWithLocalIdentifiers:@[newId] options:nil];
PHAsset* phass=fr.firstObject;
NSLog(@"PHAsset:%@",phass);
} else {
NSLog(@"error:%@",error);
}
}]
推荐阅读
- reactjs - React Native FlatList 闪烁延迟加载附加数据
- nestjs - NestJS 中真的需要服务提供者吗?
- html - 鼠标悬停功能参考不同在同一个 Vue.js 函数上
- sql-server - SQL Server - 百分比变化计算仅应用于两个字段相同的行
- c# - 整数列表和 IQueryble 之间的 LINQ 连接导致 c# 中的 StackOverflow 异常
- c# - 如何使用 nugets 避免 MissingMethodException?
- python-3.x - scrapy:限制链接提取到请求域
- sql - SQL Server Integration Services 2016 错误,无法批量加载 XML 文件
- c# - C# Windows 窗体 DataGridView:不显示水平滚动
- elasticsearch - 在 Elasticsearch 中对索引调用 _search API 时出错