SDWebImageHEIFCoder 0.10.1

SDWebImageHEIFCoder 0.10.1

DreamPiggyBogdan Poplauschi 维护。



  • 作者:
  • DreamPiggy

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

性能

苹果的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包含子规格libde265libx265。它们将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

感谢