苹果在 iOS 11 的发布会上,推出了两种新的媒体格式 HEIF
HEVC
,都是为了保证画质的状况下,大大减小视频、照片的大小。html
HEVC
全称 High Efficiency Video Coding(高效率视频编码),是比H.264更加优秀的一种视频压缩标准(也称为 H.265)。HEVC 在低码率视频压缩上,提高质量、减小容量和节省带宽方面都有突出表现,所以除了拍摄占用的容量减小外,在视频通话时也能更加流畅清晰。git
HEIF
: 高效率图像文件格式(英语:High Efficiency Image File Format, HEIF;也称高效图像文件格式)是一个用于单张图像或图像序列的文件格式。它由运动图像专家组(MPEG)开发,并在MPEG-H Part 12(ISO/IEC 23008-12)中定义。用于HEVC关键帧的处理上,所以它一样能够用更少的容量来存储画质更好的照片,在连拍、动图和色彩变化不大的照片上效果尤为明显。github
HEIF规范也定义了高效率视频编码(HEVC)编码的内嵌图像和HEVC编码的图像序列的存储方式,其中以受约束的方式应用帧间预测。ide
HEIF文件与ISO基本媒体文件格式(ISOBMFF,ISO/IEC 14496-12)兼容,而且还能够包括其余媒体流,例如定时的文本和音频。ui
HEIF 文件能够包含 GIF 动图、HDR 相片、连拍、Live Photo。编码
HEIF扩展名:.heif、.heic。
互联网媒体类型:image/heif、image/heic、image/heif-sequence、image/atom
识别HEIFcode
识别HEIF文件的方法和识别GIF同样,对比文件UTI(uniformTypeIdentifier)orm
- (BOOL)isHeif:(PHAsset *)asset { __block BOOL isHEIF = NO; NSArray *resourceList = [PHAssetResource assetResourcesForAsset:asset]; [resourceList enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { PHAssetResource *resource = obj; NSString *UTI = resource.uniformTypeIdentifier; if ([UTI isEqualToString:AVFileTypeHEIF] || [UTI isEqualToString:AVFileTypeHEIC]) { isHEIF = YES; *stop = YES; } }]; return isHEIF; }
检测设备是否支持硬解码 HEVC视频
VTIsHardwareDecodeSupported(kCMVideoCodecType_HEVC)
系统选图对 HEIF 的支持
UIImagePickerController
添加了一个枚举类型:
```
typedef enum UIImagePickerControllerImageURLExportPreset : NSInteger {
UIImagePickerControllerImageURLExportPresetCompatible = 0,
UIImagePickerControllerImageURLExportPresetCurrent
} UIImagePickerControllerImageURLExportPreset;
@property(nonatomic) UIImagePickerControllerImageURLExportPreset imageExportPreset NS_AVAILABLE_IOS(11_0); // default value is UIImagePickerControllerImageExportPresetCompatible.
```
其中,UIImagePickerControllerImageURLExportPresetCompatible
会把 HEIF 格式转成 JPEG。UIImagePickerControllerImageURLExportPresetCurrent
会显示原始的编码格式。
HEIF 格式转 JPEG 格式
[[PHImageManager defaultManager] requestImageDataForAsset:asset options:nil resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) { if ([dataUTI isEqualToString:AVFileTypeHEIF] || [dataUTI isEqualToString:AVFileTypeHEIC]) { CIImage *ciImage = [CIImage imageWithData:imageData]; CIContext *context = [CIContext context]; NSData *jpgData = [context JPEGRepresentationOfImage:ciImage colorSpace:ciImage.colorSpace options:@{}]; } else { } }];
JPEG 格式转 HEIF 格式
NSData * UIImageHEICRepresentation(UIImage *const image, const CGFloat compressionQuality) { NSData *imageData = nil; if (@available(iOS 11.0, *)) { if (image) { NSMutableData *destinationData = [NSMutableData new]; CGImageDestinationRef destination = CGImageDestinationCreateWithData((__bridge CFMutableDataRef)destinationData, (__bridge CFStringRef)AVFileTypeHEIC, 1, NULL); if (destination) { NSDictionary *options = @{(__bridge NSString *)kCGImageDestinationLossyCompressionQuality: @(compressionQuality)}; CGImageDestinationAddImage(destination, image.CGImage, (__bridge CFDictionaryRef)options); CGImageDestinationFinalize(destination); imageData = destinationData; CFRelease(destination); } else { // 建立失败,说明设备不支持 HEIF 写入 } } } return imageData; }
参考1.https://en.wikipedia.org/wiki/High_Efficiency_Image_File_Format
参考2.http://www.feng.com/iPhone/news/2017-06-19/Apple-USES-HEVC-and-HEIF-what-equipment-will-be-compatible_682999.shtml
参考3.http://www.jianshu.com/p/a63c7d5d98a9
参考4.https://github.com/timonus/UIImageHEIC