首页 > 解决方案 > 将使用 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 ?

标签: iosuiimagepickercontroller

解决方案


感谢马特的评论,我能够解决这个问题。如何将从 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);
  }
}]

推荐阅读