我尝试使用ImageIO以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;
}
这适用于具有A10的设备,但在旧设备和模拟器(也是根据Apple)上失败,因为未能初始化destination
和错误消息findWriterForType:140: unsupported file format 'public.heic'
。我没有找到任何直接的方法来测试硬件是否支持HEIC而不初始化新的图像目的地并测试可空性。
有基于AVFoundation的API用于检查是否可以使用HEIC保存照片,例如使用-[AVCapturePhotoOutput supportedPhotoCodecTypesForFileType:]
,但我不想为此初始化和配置捕获会话。
是否有更直接的方法来查看硬件是否支持此编码类型?
答案 0 :(得分:4)
ImageIO有一个名为CGImageDestinationCopyTypeIdentifiers
的函数,它会为CFArrayRef
返回CGImageDestinationRef
支持的类型。因此,以下代码可用于确定设备是否支持HEIC编码:
#import <AVFoundation/AVFoundation.h>
#import <ImageIO/ImageIO.h>
BOOL SupportsHEIC() {
NSArray<NSString *> *types = CFBridgingRelease(
CGImageDestinationCopyTypeIdentifiers());
return [types containsObject:AVFileTypeHEIC];
}
答案 1 :(得分:3)
Swift版本:
AVFileTypeHEIC
然后只使用您偏好的类型(例如if #available(iOS 11.0, *) {
supports(type: AVFileTypeHEIC)
}
)调用它:
{{1}}