Какой официальный способ проверить, может ли мое устройство кодировать изображения в формате HEIC?

Я пытаюсь сохранить изображение в формате файла HEIC, используя ImageIO. Код выглядит примерно так:

NSMutableData *imageData = [NSMutableData data];

CGImageDestinationRef destination = CGImageDestinationCreateWithData(
    (__bridge CFMutableDataRef)imageData,
    (__bridge CFStringRef)AVFileTypeHEIC, 1, NULL);
if (!destination) {
  NSLog(@"Image destination is nil");
  return;
}

// image is a CGImageRef to compress.
CGImageDestinationAddImage(destination, image, NULL);
BOOL success = CGImageDestinationFinalize(destination);
if (!success) {
  NSLog(@"Failed writing the image");
  return;
}

Это работает на устройствах с A10, но не на старых устройствах и на симуляторе (также согласно Apple), из-за невозможности инициализации destination и сообщение об ошибке findWriterForType:140: unsupported file format 'public.heic', Я не смог найти прямого способа проверить, поддерживает ли аппаратное обеспечение HEIC, без инициализации нового места назначения образа и проверки на обнуляемость.

Существуют API-интерфейсы на основе AVFoundation для проверки возможности сохранения фотографий с использованием HEIC, например, с использованием -[AVCapturePhotoOutput supportedPhotoCodecTypesForFileType:], но я не хочу инициализировать и настраивать сеанс захвата только для этого.

Есть ли более прямой способ узнать, поддерживает ли оборудование этот тип кодирования?

2 ответа

Решение

ImageIO имеет функцию под названием CGImageDestinationCopyTypeIdentifiers который возвращает CFArrayRef из поддерживаемых типов для CGImageDestinationRef, Следовательно, следующий код может использоваться для определения того, поддерживается ли кодирование HEIC на устройстве:

#import <AVFoundation/AVFoundation.h>
#import <ImageIO/ImageIO.h>

BOOL SupportsHEIC() {
  NSArray<NSString *> *types = CFBridgingRelease(
      CGImageDestinationCopyTypeIdentifiers());
  return [types containsObject:AVFileTypeHEIC];
}

Swift версия:

func supports(type: String) -> Bool {
    let supportedTypes = CGImageDestinationCopyTypeIdentifiers() as NSArray
    return supportedTypes.contains(type)
}

А затем просто позвоните с вашим предпочтительным типом (например, AVFileTypeHEIC):

if #available(iOS 11.0, *) {
    supports(type: AVFileTypeHEIC)
}
Другие вопросы по тегам