蘋果在 iOS 11 的發佈會上,推出了兩種新的媒體格式 `HEVC`,都是為了保證畫質的情況下,大大減少視頻、照片的大小。 一、簡介 全稱 High Efficiency Video Coding(高效率視頻編碼),是比H.264更加優秀的一種視頻壓縮標準(也稱為 H.265)。HEVC 在低碼率 ...
蘋果在 iOS 11 的發佈會上,推出了兩種新的媒體格式 HEIF
HEVC
,都是為了保證畫質的情況下,大大減少視頻、照片的大小。
一、簡介
HEVC
全稱 High Efficiency Video Coding(高效率視頻編碼),是比H.264更加優秀的一種視頻壓縮標準(也稱為 H.265)。HEVC 在低碼率視頻壓縮上,提升質量、減少容量和節省帶寬方面都有突出表現,因此除了拍攝占用的容量減少外,在視頻通話時也能更加流暢清晰。
HEIF
: 高效率圖像文件格式(英語:High Efficiency Image File Format, HEIF;也稱高效圖像文件格式)是一個用於單張圖像或圖像序列的文件格式。它由運動圖像專家組(MPEG)開發,併在MPEG-H Part 12(ISO/IEC 23008-12)中定義。用於HEVC關鍵幀的處理上,因此它同樣可以用更少的容量來存儲畫質更好的照片,在連拍、動圖和色彩變化不大的照片上效果尤其明顯。
HEIF規範也定義了高效率視頻編碼(HEVC)編碼的內嵌圖像和HEVC編碼的圖像序列的存儲方式,其中以受約束的方式應用幀間預測。
HEIF文件與ISO基本媒體文件格式(ISOBMFF,ISO/IEC 14496-12)相容,並且還可以包括其他媒體流,例如定時的文本和音頻。
HEIF 文件可以包含 GIF 動圖、HDR 相片、連拍、Live Photo。
HEIF擴展名:.heif、.heic。
互聯網媒體類型:image/heif、image/heic、image/heif-sequence、image/
二、對代碼的影響
識別HEIF
識別HEIF文件的方法和識別GIF一樣,對比文件UTI(uniformTypeIdentifier)
- (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