2017-08-27 11 views
3

J'essaie de sauvegarder une image dans le format de fichier HEIC en utilisant ImageIO. Le code ressemble à ceci:Quelle est la manière formelle de vérifier si mon appareil est capable d'encoder des images au format HEIC?

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; 
} 

Cela fonctionne sur les appareils avec A10, mais échoue sur les appareils plus anciens et sur le simulateur (également selon Apple), en omettant d'initialiser le destination et le message d'erreur findWriterForType:140: unsupported file format 'public.heic'. Je n'ai pas trouvé de moyen direct de tester si le matériel supporte HEIC sans initialiser une nouvelle destination d'image et tester la nullabilité.

Il existe des API basées sur AVFoundation pour vérifier si les photos peuvent être enregistrées en utilisant HEIC, par exemple en utilisant -[AVCapturePhotoOutput supportedPhotoCodecTypesForFileType:], mais je ne veux pas initialiser et configurer une session de capture juste pour cela.

Existe-t-il un moyen plus direct de voir si le matériel prend en charge ce type de codage?

Répondre

4

ImageIO a une fonction appelée CGImageDestinationCopyTypeIdentifiers qui renvoie un CFArrayRef des types pris en charge pour CGImageDestinationRef. Par conséquent, le code suivant peut être utilisé pour déterminer si le codage HEIC est pris en charge sur l'appareil:

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

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

Version Swift:

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

Et puis il suffit d'appeler avec votre type préféré (par exemple AVFileTypeHEIC):

if #available(iOS 11.0, *) { 
    supports(type: AVFileTypeHEIC) 
}