【问题标题】:Save image taken with UIImagePickerController to photo roll in HEIC format将使用 UIImagePickerController 拍摄的图像以 HEIC 格式保存到照片卷
【发布时间】: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? 就像stackoverflow.com/questions/4623931/… 中提到的那样吗?
  • stackoverflow.com/questions/47470419/… 告诉您如何获取 HEIF 数据,然后,正如我之前所说,您应该能够从该数据创建资产。
  • @matt 太棒了,这行得通!我以前从未使用过 CIImage,所以如果没有指针,我将无法解决它。我想知道为什么这里没有像 UIImageHEIFRepresentation 这样的东西来拥有更高级别的东西。

标签: ios uiimagepickercontroller


【解决方案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);
  }
}]

【讨论】:

    猜你喜欢
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    相关资源
    最近更新 更多