验证我的设备是否能够以 HEIC 格式编码图像的正式方法是什么?
What's the formal way to verify if my device is capable of encoding images in HEIC format?
我正在尝试使用 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:]
,但我不想为此初始化和配置捕获会话。
有没有更直接的方法查看硬件是否支持这种编码类型?
ImageIO 有一个名为 CGImageDestinationCopyTypeIdentifiers
的函数,其中 returns 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)
}
我正在尝试使用 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:]
,但我不想为此初始化和配置捕获会话。
有没有更直接的方法查看硬件是否支持这种编码类型?
ImageIO 有一个名为 CGImageDestinationCopyTypeIdentifiers
的函数,其中 returns 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)
}