将使用 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 格式保存到照片卷的主要内容,如果未能解决你的问题,请参考以下文章