libheif 1.17.0

libheif 1.17.0

DreamPiggyBogdan Poplauschi 维护。



libheif 1.17.0

  • struktur AG

libheif

Build Status Build Status Coverity Scan Build Status

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_HEVCheif_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以构建配置脚本,然后调用./configuremake。确保首先编译并安装libde265,以便配置脚本可以找到它。最好下载libde265的frame-parallel分支,因为这个分支使用的API比master分支中的版本更新。如果您想使用HEIF编码,还必须安装x265及其开发文件。

对于AVIF支持,必须安装libaom。

macOS

  1. 使用Homebrew安装依赖项

    brew install automake make pkg-config x265 libde265 libjpeg
    
  2. 配置并构建项目

    ./autogen.sh
    ./configure
    make
    

Windows

Libheif被包含在Vcpkg中。

为AVIF添加rav1e编码器

  • 安装cargo
  • 通过执行以下操作安装cargo-c
cargo install --force cargo-c
  • third-party目录中运行rav1e.cmd脚本以下载rav1e并编译它。

当运行cmakeconfigure时,请确保环境变量PKG_CONFIG_PATH包含到third-party/rav1e/dist/lib/pkgconfig的绝对路径。

为AVIF添加dav1d解码器

  • 安装 meson
  • third-party目录中运行dav1d.cmd脚本来下载dav1d并编译它。

当运行cmakeconfigure时,请确保环境变量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.xmlavif.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 的软件

许可协议

libheif 以 GNU Lesser General Public License 的条款进行分发。示例应用程序以 MIT 许可证的条款进行分发。

有关更多详情,请参阅 COPYING 文件。

版权所有 (c) 2017-2020 Struktur AG 联系方式: Dirk Farin [email protected]