SDWebImageHEIFCoder

CI Status Version License Platform SwiftPM compatible Carthage compatible codecov

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 的版本。

性能

Apple 的 Image/IO 框架支持硬件加速的 HEIF 解码(A9+ 芯片)和编码(A10+ 芯片)。并且在所有 iOS 11+/macOS 10.13+ 设备上提供备份软件解码和编码。

此编码器用于向后兼容的解决方案。并且该编解码器仅执行软件解码/编码,这比 Image/IO 慢。因此,如果可能,请首先选择使用 Image/IO(SDWebImage 的内置编码器)。

要求

安装

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 获得。

Carthage 不支持像 CocoaPods 的子规范一样,因为大多数用户使用 HEIF 解码而无需 x265 库。 通过 Carthage 的框架仅支持 libde265 用于 HEIF 解码。

github "SDWebImage/SDWebImageHEIFCoder"

Swift Package Manager (Xcode 11+)

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)

缩略图解码 (0.7.0+)

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

缩略图编码 (0.8.0+)

// 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

感谢