Сохранить изображение, снятое с помощью UIImagePickerController, в фотопленку в формате HEI C - PullRequest
1 голос
/ 13 марта 2020

Если я сохраню изображение в фотопленке с помощью известных мне методов (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, имеет расширение HEI C (учитывая, что настройка «Высокая эффективность» действует в настройках «Камера»).

Так что же удобно сохранить в HEI C формат для фотопленки в ответ на - (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info?

1 Ответ

1 голос
/ 13 марта 2020

Благодаря комментариям Мэтта я смог решить проблему. Есть очень похожий вопрос на Как сохранить изображение, полученное из 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);
  }
}]
...