Libavif 快速上手
1. 什么是 libavif?
libavif 是一个开源的 AVIF 图像编码和解码库。AVIF (AV1 Image File Format) 是一种基于 AV1 视频编码格式的图像格式,旨在提供高效的图像压缩和高质量的图像显示。AVIF 格式因其出色的压缩性能和支持 HDR(高动态范围)等现代图像特性而备受关注,特别适用于网页图片、移动设备图片等需要高效传输和存储的场景。
2. 安装 libavif
2.1 使用包管理器安装
在一些操作系统中可以通过包管理器直接安装 libavif。例如:
-
macOS:使用 Homebrew
brew install libavif
-
Debian/Ubuntu:使用 APT
sudo apt update
sudo apt install libavif
2.2 从源码构建
如果想要使用最新版本的 libavif,可以选择从源码构建。步骤如下:
-
克隆 libavif 的 GitHub 仓库:
git clone https://github.com/AOMediaCodec/libavif.git
cd libavif -
构建 libavif:
mkdir build
cd build
cmake ..
make
sudo make install
3. libavif 的基础使用
3.1 加载和保存 AVIF 图像
libavif 提供了简单的编码和解码接口。以下是加载和保存 AVIF 图像的基本步骤:
#include <avif/avif.h>
#include <stdio.h>
#include <stdlib.h>
// 加载 AVIF 图像
avifImage* load_avif(const char* filename) {
FILE* file = fopen(filename, "rb");
if (!file) {
fprintf(stderr, "无法打开文件: %s\n", filename);
return NULL;
}
fseek(file, 0, SEEK_END);
size_t fileSize = ftell(file);
fseek(file, 0, SEEK_SET);
uint8_t* data = (uint8_t*)malloc(fileSize);
fread(data, 1, fileSize, file);
fclose(file);
avifDecoder* decoder = avifDecoderCreate();
avifImage* image = avifImageCreateEmpty();
avifResult result = avifDecoderRead(decoder, image, data, fileSize);
free(data);
avifDecoderDestroy(decoder);
if (result != AVIF_RESULT_OK) {
fprintf(stderr, "解码 AVIF 图像失败: %s\n", avifResultToString(result));
avifImageDestroy(image);
return NULL;
}
return image;
}
// 保存 AVIF 图像
void save_avif(avifImage* image, const char* filename) {
avifEncoder* encoder = avifEncoderCreate();
encoder->maxThreads = 4;
encoder->speed = AVIF_SPEED_FASTEST;
avifRWData output = AVIF_DATA_EMPTY;
avifResult result = avifEncoderWrite(encoder, image, &output);
avifEncoderDestroy(encoder);
if (result == AVIF_RESULT_OK) {
FILE* file = fopen(filename, "wb");
fwrite(output.data, 1, output.size, file);
fclose(file);
} else {
fprintf(stderr, "编码 AVIF 图像失败: %s\n", avifResultToString(result));
}
avifRWDataFree(&output);
}
4. 图像质量和编码设置
libavif 支持多种编码参数,可以通过调节这些参数来控制图像的质量和文件大小。
- 质量控制:可以通过
encoder->quality
来控制编码质量,取值范围从 0(最低质量)到 100(最高质量)。 - 压缩速度:通过
encoder->speed
控制,取值范围从 0(最慢)到 10(最快)。较慢的速度通常会产生更小的文件,但需要更长的时间来编码。
encoder->quality = 50; // 质量设置为 50,平衡质量和文件大小
encoder->speed = AVIF_SPEED_FASTEST; // 设置为最快速度
5. 支持的色彩特性
AVIF 格式支持广色域和 HDR。libavif 可以处理高位深度(如 10-bit 或 12-bit)的图像,并支持不同的色彩空间,如 YUV420、YUV422 和 YUV444。可以通过 avifImageAllocatePlanes()
函数来分配所需的色彩通道。
image->depth = 10; // 设置为 10-bit 色深
image->yuvFormat = AVIF_PIXEL_FORMAT_YUV420; // 使用 YUV420 格式
avifImageAllocatePlanes(image, AVIF_PLANES_YUV); // 分配 YUV 通道
6. 高级功能:批量处理和多线程
libavif 支持多线程编码,通过 encoder->maxThreads
参数可以指定最大线程数,从而加速批量处理。
7. 常见问题和调试技巧
- 解码失败:检查输入文件是否为正确的 AVIF 格式,确保文件没有损坏。
- 图像质量差:尝试调整编码质量参数,如提高
quality
和降低speed
。