21 个稳定版本
2.1.1+1.17.4 | 2024年5月8日 |
---|---|
2.1.0+1.17.4 | 2023年11月28日 |
2.0.0+1.16.2 | 2023年9月12日 |
1.16.2 | 2023年9月8日 |
1.4.2 | 2019年7月16日 |
在 图像 中排名第 247
每月下载量 2,630
在 13 个crates中使用(直接使用2个)
285KB
3K SLoC
libheif-sys 是 libheif 的绑定库
系统依赖
libheif-dev
>= 1.17.0(如果启用use-bindgen
功能,则任何版本)clang
- 用于为libheif
生成 Rust 绑定。 查看 bindgen 的要求。
clang
不需要,如果您禁用了 use-bindgen
功能。在这种情况下,将使用预生成的文件 bindings.rs
,而不是使用 bindgen
crate 动态生成它。
警告: bindings.rs
文件是在 x64 Linux 上生成的,可能在 x32 架构或其他操作系统上无法正常工作。
Linux
该crate使用 pkg-confing
来查找已安装的 libheif
。
Windows
该crate使用 vcpkg crate 来查找使用 vcpkg
安装的 libheif
。
您可以使用 cargo-vcpkg 通过 cargo
命令安装 libheif
。
cargo vcpkg -v build
cargo-vcpkg
可以从头开始检索和构建所需的 vcpkg
安装包。它合并了依赖树中crates的 Cargo.toml
中指定的包要求。
读取和解码 HEIF 图像的示例
use std::ffi;
use std::ptr;
use libheif_sys as lh;
#[test]
fn read_and_decode_heic_file() {
unsafe {
lh::heif_init(ptr::null_mut());
let ctx = lh::heif_context_alloc();
assert_ne!(ctx, ptr::null_mut());
let c_name = ffi::CString::new("data/test.heif").unwrap();
let err = lh::heif_context_read_from_file(ctx, c_name.as_ptr(), ptr::null());
assert_eq!(err.code, 0);
let mut handle = ptr::null_mut();
let err = lh::heif_context_get_primary_image_handle(ctx, &mut handle);
assert_eq!(err.code, 0);
assert!(!handle.is_null());
let width = lh::heif_image_handle_get_width(handle);
assert_eq!(width, 4032);
let height = lh::heif_image_handle_get_height(handle);
assert_eq!(height, 3024);
let options = lh::heif_decoding_options_alloc();
let mut image = ptr::null_mut();
let err = lh::heif_decode_image(
handle,
&mut image,
lh::heif_colorspace_heif_colorspace_RGB,
lh::heif_chroma_heif_chroma_444,
options,
);
lh::heif_decoding_options_free(options);
assert_eq!(err.code, 0);
assert!(!image.is_null());
let colorspace = lh::heif_image_get_colorspace(image);
assert_eq!(colorspace, lh::heif_colorspace_heif_colorspace_RGB);
let chroma_format = lh::heif_image_get_chroma_format(image);
assert_eq!(chroma_format, lh::heif_chroma_heif_chroma_444);
let width = lh::heif_image_get_width(image, lh::heif_channel_heif_channel_R);
assert_eq!(width, 4032);
let height = lh::heif_image_get_height(image, lh::heif_channel_heif_channel_R);
assert_eq!(height, 3024);
lh::heif_context_free(ctx);
lh::heif_deinit();
};
}