2017-08-27 2 views
3

Ich versuche, ein Bild im HEIC-Dateiformat mit ImageIO zu speichern. Der Code sieht etwa so aus:Wie kann ich überprüfen, ob mein Gerät Bilder im HEIC-Format verschlüsseln kann?

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

Dies funktioniert auf Geräten mit A10, aber nicht auf älteren Geräten und auf dem Simulator (auch Apple nach), indem sie nicht die destination und die Fehlermeldung findWriterForType:140: unsupported file format 'public.heic' zu initialisieren. Ich konnte keinen direkten Weg finden, um zu testen, ob die Hardware HEIC unterstützt, ohne ein neues Bildziel zu initialisieren und auf Nullfähigkeit zu testen.

Es gibt AVFoundation-basierte APIs zum Überprüfen, ob Fotos mit HEIC gespeichert werden können, zum Beispiel mit -[AVCapturePhotoOutput supportedPhotoCodecTypesForFileType:], aber ich möchte keine Capture-Sitzung nur dafür initialisieren und konfigurieren.

Gibt es einen direkteren Weg, um zu sehen, ob die Hardware diesen Kodierungstyp unterstützt?

Antwort

4

ImageIO hat eine Funktion namens CGImageDestinationCopyTypeIdentifiers, die einen CFArrayRef der unterstützten Typen für CGImageDestinationRef zurückgibt. Daher kann der folgende Code verwendet werden, um festzustellen, ob HEIC Codierung auf dem Gerät unterstützt wird:

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

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

Swift Version:

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

Und dann rufen Sie einfach mit Ihrem bevorzugten Typ (zB AVFileTypeHEIC):

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