将使用 UIImagePickerController 拍摄的图像以 HEIC 格式保存到照片卷

Posted

技术标签:

【中文标题】将使用 UIImagePickerController 拍摄的图像以 HEIC 格式保存到照片卷【英文标题】:Save image taken with UIImagePickerController to photo roll in HEIC format 【发布时间】:2020-03-13 12:14:17 【问题描述】:

如果我使用我知道的方法(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 ?

【问题讨论】:

@matt 我不太熟悉 UIImage 的内部结构。你指的是let rawData = myImage.cgImage?.dataProvider?.data as Data? 就像***.com/questions/4623931/… 中提到的那样吗? ***.com/questions/47470419/… 告诉您如何获取 HEIF 数据,然后,正如我之前所说,您应该能够从该数据创建资产。 @matt 太棒了,这行得通!我以前从未使用过 CIImage,所以如果没有指针,我将无法解决它。我想知道为什么这里没有像 UIImageHEIFRepresentation 这样的东西来拥有更高级别的东西。 【参考方案1】:

感谢 Matt cmets,我能够解决这个问题。 How to save image taken from UIImagePickerController as HEIF file? 有一个非常相似的问题,但并不完全相同。

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);
  
]

【讨论】:

以上是关于将使用 UIImagePickerController 拍摄的图像以 HEIC 格式保存到照片卷的主要内容,如果未能解决你的问题,请参考以下文章

如何调整自定义 UIButton 的图像大小?

从保存的相机胶卷参考 url 设置 uiimageview

iPhone - 以编程方式删除状态栏

如何从 Xamarin.ios 访问 UIImagePickerController 快门 UiButton

Segue 图像到另一个视图控制器的问题

我可以将 Visual C++ 用于将使用 gcc 编译的作业吗?