SDWebImageHEIFCoder
4.x 兼容性
SDWebImage 5.x 改变了自定义图片编解码器 API。此 master
分支遵循 SDWebImage 的 5.x
分支。对于 4.x 兼容性 HEIF 编码器支持,请切换到 4.x
分支。
我们的目标
这是一个 SDWebImage 编码器插件,用于添加对 高效率图像文件格式 (HEIF) 的支持。它基于开源的 libheif 编解码器构建。
这个 HEIF 编码器插件目前支持 HEIF 单个/静态图像的 解码 以及 HEIC 图像的 编码。
解码支持具有 10/12 位深度(比常规 8 位更大)的 HDR HEIF 图像。
它支持 iOS 9+/macOS 10.11+ 设备,无需依赖 Apple 的 Image/IO 框架。
对于 iOS 8+/macOS 10.10+,请使用低于 0.10.0 的版本。
性能
苹果的Image/IO框架支持(A9+芯片)的硬件加速HEIF解码和(A10+芯片)编码。并为所有iOS 11+/macOS 10.13+设备提供备份的软件解码和编码功能。
此编码器用于向后兼容解决方案。该编解码器仅执行软件解码/编码,速度比Image/IO慢。因此,如果可能,请首先选择使用Image/IO(SDWebImage内置编码器)。
需求
- iOS 9.0
- tvOS 9.0
- macOS 10.11
- watchOS 2.0
- Xcode 11.0
安装
CocoaPods
SDWebImageHEIFCoder通过CocoaPods提供。要安装它,只需将以下行添加到Podfile。
pod 'SDWebImageHEIFCoder'
SDWebImageHEIFCoder包含子规格libde265
和libx265
。它们将libheif编解码器插件集成到编解码器中,以支持HEIF图像的解码/编码。
要启用HEIF解码,您应添加libde265
子规格。
pod 'SDWebImageHEIFCoder/libde265'
要启用HEIF编码,您应添加libx265
子规格。
pod 'SDWebImageHEIFCoder/libx265'
默认情况下,它将只包含libde265
子规格,以适应大多数人的使用。如果需要HEIF编码,则仅使用libx265
编码子规格。
Carthage
SDWebImageHEIFCoder可通过Carthage(https://github.com/Carthage/Carthage)安装。
Carthage不支持像CocoaPods的子规格一样,因为大多数用户使用HEIF解码而不需要x265库。通过Carthage提供的框架仅支持libde265进行的HEIF解码。
github "SDWebImage/SDWebImageHEIFCoder"
Swift包管理器(Xcode 11+)
SDWebImageHEIFCoder可通过Swift Package Manager(https://swift.org/package-manager)安装。
通过SwiftPM提供的框架仅支持libde265进行的HEIF解码。
let package = Package(
dependencies: [
.package(url: "https://github.com/SDWebImage/SDWebImageHEIFCoder.git", from: "0.6")
]
)
使用方法
添加编码器
要使用HEIF编码器,首先需要将 SDImageHEIFCoder.sharedCoder
添加到编码器管理器中。您还可以检测HEIF的靶平台兼容性并选择添加编码器。
- Objective-C
if (@available(iOS 11.0, macOS 10.13, tvOS 11.0, *)) {
// These version supports Image/IO built-in decoding
} else {
// Don't support HEIF decoding, add coder
SDImageHEIFCoder *HEIFCoder = [SDImageHEIFCoder sharedCoder];
[[SDImageCodersManager sharedManager] addCoder:HEIFCoder];
}
- Swift
if #available(iOS 11.0, macOS 10.13, tvOS 11.0, *) {
// These version supports Image/IO built-in decoding
} else {
// Don't support HEIF decoding, add coder
let HEIFCoder = SDImageHEIFCoder.shared
SDImageCodersManager.shared.addCoder(HEIFCoder)
}
加载
然后您可以调用视图类别方法来开始加载HEIF图像。
- Objective-C
UIImageView *imageView;
[imageView sd_setImageWithURL:url];
- Swift
let imageView: UIImageView
imageView.sd_setImage(with: url)
解码
SDImageHEIFCoder
目前支持解码静态HEIF图像。
注意:目前不支持HEIF序列图像(.heics),仅在 iOS 13+/macOS 10.15+ 内置的编码器中支持,并且由 Safari 和 WebKit 支持。
- Objective-C
// HEIF image decoding
NSData *heifData;
UIImage *image = [[SDImageHEIFCoder sharedCoder] decodedImageWithData:heifData options:nil];
- Swift
// HEIF image decoding
let heifData: Data
let image = SDImageHEIFCoder.shared.decodedImage(with: data, options: nil)
缩略图解码(0.7.0+)
HEIF图像容器支持嵌入缩略图图像。如果我们可以找到一个合适的缩略图图像,我们将选择它来快速显示,否则我们将解码全像素图像并对其进行缩放。
- Objective-C
// HEIF thumbnail image decoding
NSData *heifData;
CGSize thumbnailSize = CGSizeMake(300, 300);
UIImage *thumbnailImage = [[SDImageHEIFCoder sharedCoder] decodedImageWithData:heifData options:@{SDImageCoderDecodeThumbnailPixelSize : @(thumbnailSize}];
- Swift
// HEIF thumbnail image decoding
let heifData: Data
let thumbnailSize = CGSize(width: 300, height: 300)
let image = SDImageHEIFCoder.shared.decodedImage(with: data, options: [.decodeThumbnailPixelSize: thumbnailSize])
编码
SDWebImageHEIFCoder
同样支持 HEIF 编码(需要 x265 子规范)。可以将 UIImage
编码为 HEIF 压缩图像数据。
- Objective-C
UIImage *image;
NSData *imageData = [image sd_imageDataAsFormat:SDImageFormatHEIF];
// Encode Quality
NSData *lossyData = [[SDImageHEIFCoder sharedCoder] encodedDataWithImage:image format:SDImageFormatHEIF options:@{SDImageCoderEncodeCompressionQuality : @(0.1)}]; // [0, 1] compression quality
NSData *limitedData = [[SDImageHEIFCoder sharedCoder] encodedDataWithImage:image format:SDImageFormatHEIF options:@{SDImageCoderEncodeMaxFileSize : @(1024 * 10)}]; // v0.8.0 feature, limit output file size <= 10KB
- Swift
let image;
let imageData = image.sd_imageData(as: .HEIF)
// Encode Quality
let lossyData = SDImageHEIFCoder.shared.encodedData(with: image, format: .heif, options: [.encodeCompressionQuality: 0.1]) // [0, 1] compression quality
let limitedData = SDImageHEIFCoder.shared.encodedData(with: image, format: .heif, options: [.encodeMaxFileSize: 1024 * 10]) // v0.8.0 feature, limit output file size <= 10KB
缩略图编码(0.8.0+)
- Objective-C
// HEIF image thumbnail encoding
UIImage *image;
NSData *thumbnailData = [[SDImageHEIFCoder sharedCoder] encodedDataWithImage:image format:SDImageFormatHEIF options:@{SDImageCoderEncodeMaxPixelSize : @(CGSizeMake(200, 200)}, SDImageCoderEncodeEmbedThumbnail : @(YES)];
// v0.8.0 feature, encoding max pixel size
// v0.9.0 feature, control whether to embed thumbnail (max 320x320 pixels)
- Swift
// HEIF image thumbnail encoding
let image: UIImage
let thumbnailData = SDImageHEIFCoder.shared.encodedData(with: image, format: .heif, options: [.encodeMaxPixelSize: CGSize(width: 200, height: 200), .encodeEmbedThumbnail : true])
// v0.8.0 feature, encoding max pixel size
// v0.9.0 feature, control whether to embed thumbnail (max 320x320 pixels)
更多信息,请参阅 SDWebImage Wiki - 编码器
截图
这些图像来自 HEIF 官方网站示例
作者
DreamPiggy, [email protected]
许可
SDWebImageHEIFCoder 本身遵循 MIT 许可协议。有关更多信息,请参阅 LICENSE 文件。然而,在使用 libx265
时,许可将受 GPL 许可协议约束(如果您有商业许可,则为商业许可)。更多信息请访问 x265.org。