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 的版本。
Apple 的 Image/IO 框架支持硬件加速的 HEIF 解码(A9+ 芯片)和编码(A10+ 芯片)。并且在所有 iOS 11+/macOS 10.13+ 设备上提供备份软件解码和编码。
此编码器用于向后兼容的解决方案。并且该编解码器仅执行软件解码/编码,这比 Image/IO 慢。因此,如果可能,请首先选择使用 Image/IO(SDWebImage 的内置编码器)。
SDWebImageHEIFCoder 可通过 CocoaPods 获得。 要安装它,只需将以下行添加到您的 Podfile 中
pod 'SDWebImageHEIFCoder'
SDWebImageHEIFCoder 包含子规范 libde265
& libx265
。 它集成了 libheif 的编解码器插件以支持 HEIF 图像解码/编码。
要启用 HEIF 解码,您应该添加 libde265
子规范
pod 'SDWebImageHEIFCoder/libde265'
要启用 HEIF 编码,您应该添加 libx265
子规范
pod 'SDWebImageHEIFCoder/libx265'
默认情况下,将仅包含 libde265
子规范以满足大多数人的使用需求。 仅当您需要 HEIF 编码时才使用 libx265
编码子规范。
SDWebImageHEIFCoder 可通过 Carthage 获得。
Carthage 不支持像 CocoaPods 的子规范一样,因为大多数用户使用 HEIF 解码而无需 x265 库。 通过 Carthage 的框架仅支持 libde265 用于 HEIF 解码。
github "SDWebImage/SDWebImageHEIFCoder"
SDWebImageHEIFCoder 可通过 Swift Package Manager 获得。
通过 SwiftPM 的框架仅支持 libde265 用于 HEIF 解码。
let package = Package(
dependencies: [
.package(url: "https://github.com/SDWebImage/SDWebImageHEIFCoder.git", from: "0.6")
]
)
要使用 HEIF 编码器,您应该首先将 SDImageHEIFCoder.sharedCoder
添加到编码器管理器。 您还可以检测目标平台与 HEIF 的兼容性并选择添加编码器。
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];
}
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)
}
然后您可以调用 View Category 方法来开始加载 HEIF 图像。
UIImageView *imageView;
[imageView sd_setImageWithURL:url];
let imageView: UIImageView
imageView.sd_setImage(with: url)
SDImageHEIFCoder
当前支持解码静态 HEIF 图像。
请注意,目前不支持 HEIF 序列图像 (.heics),仅 SDWebImage 的内置编码器在 iOS 13+/macOS 10.15+ 中支持,Safari 和 WebKit 也支持。
// HEIF image decoding
NSData *heifData;
UIImage *image = [[SDImageHEIFCoder sharedCoder] decodedImageWithData:heifData options:nil];
// HEIF image decoding
let heifData: Data
let image = SDImageHEIFCoder.shared.decodedImage(with: data, options: nil)
HEIF 图像容器支持嵌入缩略图图像。 如果我们可以找到合适的缩略图图像,我们将选择它来快速显示,否则我们将解码完整的像素图像并缩小。
// HEIF thumbnail image decoding
NSData *heifData;
CGSize thumbnailSize = CGSizeMake(300, 300);
UIImage *thumbnailImage = [[SDImageHEIFCoder sharedCoder] decodedImageWithData:heifData options:@{SDImageCoderDecodeThumbnailPixelSize : @(thumbnailSize}];
// 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 压缩图像数据。
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
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
// 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)
// 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, lizhuoli1126@126.com
SDWebImageHEIFCoder 本身是在 MIT 许可证下提供的。 有关更多信息,请参见 LICENSE 文件。 但是,使用 libx265
时,该许可证将受 GPL 许可证的约束(如果您有商业许可证,则为商业许可证)。 有关更多信息,请查看 x265.org。