12 stable releases

1.14.2 Jan 31, 2023
1.12.0 May 12, 2021
1.11.0 Feb 3, 2021
1.9.0 Sep 26, 2020
1.4.2 Jul 16, 2019

#260 in Images

Download history 198/week @ 2022-11-27 218/week @ 2022-12-04 187/week @ 2022-12-11 204/week @ 2022-12-18 140/week @ 2022-12-25 186/week @ 2023-01-01 146/week @ 2023-01-08 107/week @ 2023-01-15 208/week @ 2023-01-22 323/week @ 2023-01-29 197/week @ 2023-02-05 196/week @ 2023-02-12 931/week @ 2023-02-19 731/week @ 2023-02-26 1297/week @ 2023-03-05 1157/week @ 2023-03-12

4,165 downloads per month
Used in 8 crates (via libheif-rs)

MIT license

2.5MB
2K SLoC

libheif-sys is bindings to libheif

CHANGELOG

System dependencies

  • libheif-dev >= 1.14.0

Example of reading and decoding of HEIF-image

use std::ffi;
use std::mem::MaybeUninit;
use std::ptr;

use libheif_sys as lh;

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("tests/window.heic").unwrap();
        let err = lh::heif_context_read_from_file(ctx, c_name.as_ptr(), ptr::null());
        assert_eq!(err.code, 0);

        let mut handle = MaybeUninit::<_>::uninit();
        let err = lh::heif_context_get_primary_image_handle(ctx, handle.as_mut_ptr());
        assert_eq!(err.code, 0);

        let handle = handle.assume_init();
        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 = MaybeUninit::<_>::uninit();
        let err = lh::heif_decode_image(
            handle,
            image.as_mut_ptr(),
            lh::heif_colorspace_heif_colorspace_RGB,
            lh::heif_chroma_heif_chroma_444,
            options,
        );
        lh::heif_decoding_options_free(options);
        assert_eq!(err.code, 0);

        let image = image.assume_init();
        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();
    };
}

Dependencies