libheif
libheif 是一个符合 ISO/IEC 23008-12:2017 HEIF 和 AVIF (AV1 图像文件格式) 文件格式的解码器和编码器。
HEIF 和 AVIF 是使用 HEVC (h.265) 或 AV1 图像编码的不同图像文件格式,分别提供目前可能的最佳压缩比。
libheif 使用 libde265 进行 HEIF 图像解码,并使用 x265 进行编码。对于 AVIF,使用 libaom、dav1d 或 rav1e 作为编解码器。
支持的特性
libheif 支持解码
- 瓦片图像
- alpha 通道
- 缩略图
- 读取 EXIF 和 XMP 元数据
- 读取深度通道
- 文件中的多张图像
- 图像变换(裁剪、反转、旋转)
- 叠加图像
- 插件接口,用于添加其他格式的编解码器(如 AVC、JPEG)
- 下载时解码文件(例如,在文件完全下载前提取图像大小)
- 读取颜色配置文件
- heix 图像(10 和 12 位,色度 4:2:2)
编码器支持
- 可调整质量的损失压缩
- 无损压缩
- alpha 通道
- 缩略图
- 将多张图像保存到文件中
- 保存 EXIF 和 XMP 元数据
- 写入颜色配置文件
- 10 和 12 位图像
- 单色图像
API
该库有一个 C API,易于集成和广泛的语言支持。请注意,API 仍在开发中,可能还会发生变化。
解码器自动支持HEIF和AVIF格式,通过相同的API即可实现。不需要对现有代码进行修改即可支持AVIF格式。只需将heif_compression_HEVC
或heif_compression_AV1
设置为heif_context_get_encoder_for_format()
即可在HEIF格式和AVIF格式之间切换。
在HEIF文件中加载主图像就像这样简单
heif_context* ctx = heif_context_alloc();
heif_context_read_from_file(ctx, input_filename, nullptr);
// get a handle to the primary image
heif_image_handle* handle;
heif_context_get_primary_image_handle(ctx, &handle);
// decode the image and convert colorspace to RGB, saved as 24bit interleaved
heif_image* img;
heif_decode_image(handle, &img, heif_colorspace_RGB, heif_chroma_interleaved_RGB, nullptr);
int stride;
const uint8_t* data = heif_image_get_plane_readonly(img, heif_channel_interleaved, &stride);
以这种方式写入HEIF文件
heif_context* ctx = heif_context_alloc();
// get the default encoder
heif_encoder* encoder;
heif_context_get_encoder_for_format(ctx, heif_compression_HEVC, &encoder);
// set the encoder parameters
heif_encoder_set_lossy_quality(encoder, 50);
// encode the image
heif_image* image; // code to fill in the image omitted in this example
heif_context_encode_image(ctx, image, encoder, nullptr, nullptr);
heif_encoder_release(encoder);
heif_context_write_to_file(context, "output.heic");
有关完整的C API,请参阅头文件heif.h
。
还有一个C++ API,它是对C API的只包含头的包装器。因此,您可以使用C++ API并且仍然保持二进制兼容。使用C++ API编写的代码比直接使用C API的代码更加简洁。
还有一个实验性的Go API,但这个API目前还不稳定。
编译
此库使用标准autoconf/automake构建系统或CMake。
当使用autoconf时,运行./autogen.sh
以构建配置脚本,然后调用./configure
和make
。确保首先编译并安装libde265,以便配置脚本可以找到它。最好下载libde265的frame-parallel
分支,因为这个分支使用的API比master
分支中的版本更新。如果您想使用HEIF编码,还必须安装x265及其开发文件。
对于AVIF支持,必须安装libaom。
macOS
-
使用Homebrew安装依赖项
brew install automake make pkg-config x265 libde265 libjpeg
-
配置并构建项目
./autogen.sh ./configure make
Windows
Libheif被包含在Vcpkg中。
为AVIF添加rav1e编码器
- 安装
cargo
。 - 通过执行以下操作安装
cargo-c
:
cargo install --force cargo-c
- 在
third-party
目录中运行rav1e.cmd
脚本以下载rav1e并编译它。
当运行cmake
或configure
时,请确保环境变量PKG_CONFIG_PATH
包含到third-party/rav1e/dist/lib/pkgconfig
的绝对路径。
为AVIF添加dav1d解码器
- 安装
meson
。 - 在
third-party
目录中运行dav1d.cmd
脚本来下载dav1d并编译它。
当运行cmake
或configure
时,请确保环境变量PKG_CONFIG_PATH
包含third-party/dav1d/dist/lib/x86_64-linux-gnu/pkgconfig
的绝对路径。
语言绑定
- .NET平台(C#、F#和其他语言):libheif-sharp
- C++:libheif的一部分
- Go:libheif的一部分
- JavaScript:通过使用emscripten编译(见下文)
- NodeJS模块:libheif-js
- Python:pyheif
- Rust:libheif-sys
可以直接与C库接口的语言(例如,Swift、C#)应该可以正常工作。
编译到JavaScript
libheif还可以使用emscripten编译成JavaScript。更多信息,请参阅build-emscripten.sh
。
在线演示
查看这个在线演示。这是在浏览器中运行的JavaScript中的libheif
。
示例程序
一些示例程序存放在examples
目录中。程序heif-convert
可以把HEIF/AVIF文件中存储的所有图像转换为JPEG或PNG。程序heif-enc
可以使你将JPEG文件转换为HEIF/AVIF。程序heif-info
是一个简单的、最小化的解码器,它会将文件结构输出到控制台。
例如,将 example.heic
转换为 JPEG 图像,并将其中一个 JPEG 图像转换回 HEIF 格式。
cd examples/
./heif-convert example.heic example.jpeg
./heif-enc example-1.jpeg -o example.heif
要将 example-1.jpeg
转换为 AVIF 格式,请使用
./heif-enc example-1.jpeg -A -o example.avif
此处也有一个 GIMP 插件,它使用 libheif:[此处链接](https://github.com/strukturag/heif-gimp-plugin)。
HEIF/AVIF 缩略图用于 Gnome 桌面
程序 heif-thumbnailer
可用作 Gnome 桌面的 HEIF/AVIF 缩略图生成器。对应的 Gnome 配置文件位于 gnome
目录。将文件 heif.xml
和 avif.xml
放入 /usr/share/mime/packages
,将 heif.thumbnailer
放入 /usr/share/thumbnailers
。可能需要运行 update-mime-database /usr/share/mime
以更新已知 MIME 类型的列表。
gdk-pixbuf 加载器
libheif 还包括用于 HEIF/AVIF 图像的 gdk-pixbuf 加载器。运行 'make install' 将插件复制到系统目录中。但是,您仍然需要运行 gdk-pixbuf-query-loaders --update-cache
以更新 gdk-pixbuf 加载器数据库。
使用 libheif 的软件
- GIMP
- Krita
- ImageMagick
- digiKam 7.0.0
- libvips
- Kodi HEIF 图像解码器插件
许可协议
libheif 以 GNU Lesser General Public License 的条款进行分发。示例应用程序以 MIT 许可证的条款进行分发。
有关更多详情,请参阅 COPYING 文件。
版权所有 (c) 2017-2020 Struktur AG 联系方式: Dirk Farin [email protected]