SDWebImageAVIFCoder 0.11.0

SDWebImageAVIFCoder 0.11.0

DreamPiggyBogdan Poplauschi 维护。



 
依赖
SDWebImage~> 5.10
libavif/core>= 0.11.0
 

  • DreamPiggy

SDWebImageAVIFCoder

Build Status Version License Platform SwiftPM compatible Carthage compatible

用途

这是一个SDWebImage的编码插件,用于添加AV1图像文件格式(AVIF)支持。它基于开源的libavif编解码器。

这个AVIF编码插件支持AVIF静态/序列图像。包括alpha通道,以及10bit/12bit/16bit HDR图像。(AVIF序列动画从v0.9.0版本开始提供)。

现也支持AVIF编码。它始终以8位深度图像进行编码。

请查看示例以获取更多展示。

注意

AVIF图像规范仍在演进中。当前的上游AVIF编解码器是一个简单实现。对于大图像,编码时间可能较长。

由于我们依赖于外部编解码器libavif,我们可能会定期更新依赖项并提升版本号。确保尽可能使用最新版本:)

AV1 编解码器

libavif 是一种图像编解码器。但由于 AVIF 基于 AV1 视频标准,因此需要 AV1 编解码器的支持。这种关系类似于 HEIF(图像)和 HEVC(视频)编解码器。

您可以选择编解码器并使用 libavif CocoaPods 子特性来选择您想要的编解码器。

aom

默认情况下,libavif 是与 aom 编解码器支持一起构建的。aom 是标准草案实施期间的第一款 AV1 编解码器。aom 支持解码和编码。

dav1d(解码)

dav1d 是下一代 AV1 编解码器,注重速度和正确性。

有关为什么开始一个新项目而不是改进 aom 的解释,请参阅 此处

从 v0.3.0 版本开始,libavif 可以与 dav1d 一起构建。对于 CocoaPods 用户,您可以通过子特性简单地进行选择。目前不支持 Carthage 的可选 dav1d 编解码器。

libgav1(解码)

libgav1 是符合主配置文件(0)和高级配置文件(1)的 AV1 解码器。有关 AV1 视频格式的更多信息,请访问 aomedia.org。

从 v0.8.3 版本开始,libavif 可以与 libgav1 一起构建。对于 CocoaPods 用户,您可以简单使用子特性进行选择。

rav1e(编码)

rav1e是速度最快、最安全的AV1编码器。它使用Rust编程语言,与aom相比提供了更快和更安全的编解码器。在当前形式下,它非常适合libaom(参考编码器)速度过慢的场景。

有关性能的更多信息请参见这里

从v0.4.3开始,libavif可以与rav1e一起构建。对于CocoaPods用户,您可以使用子规范轻松使用此功能。目前尚不支持可选的rav1c编解码器的Carthage。

注意:rav1e目前仅支持iOS和macOS。watchOS和tvOS的支持需要Rust社区上游支持。

注意:对于CocoaPods用户,rav1e是预构建的二进制文件(避免开发者安装rust工具链),并托管在GitHub Git LFS上。请确保您已安装git-lfs。

brew install git-lfs
git lfs install

SVT-AV1(编码)

SVT-AV1是针对AV1(SVT-AV1编码器和 解码器)的可伸缩视频技术(SVT-AV1编码器/解码器库核心)。

从v0.8.3开始,libavif可以与STV-AV1一起构建。对于CocoaPods用户,您可以使用子规范轻松使用此功能。

系统要求

  • iOS 9
  • macOS 10.11
  • tvOS 9.0
  • watchOS 2.0

安装

CocoaPods

SDWebImageAVIFCoder通过CocoaPods提供。要使用默认的aom AV1编解码器安装它,只需将以下行添加到您的Podfile中

pod 'SDWebImageAVIFCoder'

注意:从版本0.4.0开始,如果您想使用rav1e或dav1e编解码器而不是aom更快地解码AV1,则请控制libavif的子规范。

pod 'SDWebImageAVIFCoder'
pod 'libavif', :subspecs => [
  'libdav1d',
  'librav1e'
]

或者,对于libgav1和SVT-AV1,使用

pod 'SDWebImageAVIFCoder'
pod 'libavif', :subspecs => [
  'libgva1',
  'SVT-AV1'
]

注意:从版本0.2.0开始,依赖库libavif和libaom使用可在Apple平台上工作的便携式C实现。如果您需要带有SIMD/AVX和汇编优化的预构建库,请尝试0.1.0版本。

Carthage

SDWebImageAVIFCoder通过Carthage提供。

github "SDWebImage/SDWebImageAVIFCoder"

Carthage不支持像CocoaPods的子规范,它只支持libaom进行AVIF解码和编码。

Swift Package Manager (Xcode 11+)

SDWebImageAVIFCoder通过Swift Package Manager提供。

通过SwiftPM提供的框架只支持libaom进行AVIF解码和编码。

let package = Package(
    dependencies: [
        .package(url: "https://github.com/SDWebImage/SDWebImageAVIFCoder.git", from: "0.5")
    ]
)

使用

要使用AVIF编码器,首先应将SDImageAVIFCoder.sharedCoder添加到编码器管理器中。然后可以调用视图分类方法开始加载AVIF图片。

  • Objective-C
SDImageAVIFCoder *AVIFCoder = SDImageAVIFCoder.sharedCoder;
[[SDImageCodersManager sharedManager] addCoder:AVIFCoder];
UIImageView *imageView;
[imageView sd_setImageWithURL:url];
  • Swift
let AVIFCoder = SDImageAVIFCoder.shared
SDImageCodersManager.shared.addCoder(AVIFCoder)
let imageView: UIImageView
imageView.sd_setImage(with: url)

解码

  • Objective-C
// AVIF image decoding
NSData *avifData;
UIImage *image = [[SDImageAVIFCoder sharedCoder] decodedImageWithData:avifData options:nil];
  • Swift
// AVIF image decoding
let avifData: Data
let image = SDImageAVIFCoder.shared.decodedImage(with: data, options: nil)

缩略图解码(0.10.0+)

  • Objective-C
// AVIF thumbnail image decoding
NSData *avifData;
CGSize thumbnailSize = CGSizeMake(300, 300);
UIImage *thumbnailImage = [[SDImageAVIFCoder sharedCoder] decodedImageWithData:avifData options:@{SDImageCoderDecodeThumbnailPixelSize : @(thumbnailSize)}];
  • Swift
// AVIF thumbnail image decoding
let avifData: Data
let thumbnailSize = CGSize(width: 300, height: 300)
let image = SDImageAVIFCoder.shared.decodedImage(with: data, options: [.decodeThumbnailPixelSize: thumbnailSize])

编码(不支持动画)

  • Objective-c
// AVIF image encoding
UIImage *image;
NSData *avifData = [[SDImageAVIFCoder sharedCoder] encodedDataWithImage:image format:SDImageFormatAVIF options:nil];
// Encode Quality
NSData *lossyAVIFData = [[SDImageAVIFCoder sharedCoder] encodedDataWithImage:image format:SDImageFormatAVIF options:@{SDImageCoderEncodeCompressionQuality : @(0.1)}]; // [0, 1] compression quality
  • Swift
// AVIF image encoding
let image: UIImage
let avifData = SDImageAVIFCoder.shared.encodedData(with: image, format: .avif, options: nil)
// Encode Quality
let lossyAVIFData = SDImageAVIFCoder.shared.encodedData(with: image, format: .avif, options: [.encodeCompressionQuality: 0.1]) // [0, 1] compression quality

截图

图片来自AV1 静态图像文件格式规范测试文件

AVIF图片查看器

AVIF是一种新的图片格式,目前缺少相应的工具链支持,如浏览器或桌面查看器。

您可以在macOS中使用AVIFQuickLook QuickLook插件在Finder中查看。

您还可以尝试使用avif.js通过Chrome的AV1编解码器在线查看。

测试

SDWebImageAVIFCoder使用GitHub Actions进行测试。每次合并请求都将运行测试用例以确保AVIF解码/编码功能正常。

当前的测试用例使用macOS命令行工具,将AVIF样本解码结果与ImageMagick进行比较。

我们也有XCTest单元测试目标,您可以通过使用Xcode的测试操作来运行它。

作者

DreamPiggy,[email protected]

贡献者

ledyba-z[email protected]

许可协议

SDWebImageAVIFCoder 符合 MIT 许可协议。有关更多信息,请参阅 LICENSE 文件。

感谢