#webp #codec #decoder #encoder #image #env-var

sys no-std libwebp-sys

Bindings to libwebp (bindgen, static linking)

18 releases

Uses old Rust 2015

0.9.5 Feb 19, 2024
0.9.4 Sep 18, 2023
0.9.2 Jul 12, 2023
0.9.0 Mar 20, 2023
0.1.0 Nov 7, 2017

#72 in Images

Download history 5914/week @ 2023-12-18 2679/week @ 2023-12-25 6554/week @ 2024-01-01 9583/week @ 2024-01-08 6781/week @ 2024-01-15 8648/week @ 2024-01-22 6071/week @ 2024-01-29 7344/week @ 2024-02-05 7038/week @ 2024-02-12 7735/week @ 2024-02-19 6786/week @ 2024-02-26 5671/week @ 2024-03-04 6959/week @ 2024-03-11 8143/week @ 2024-03-18 6647/week @ 2024-03-25 6774/week @ 2024-04-01

28,888 downloads per month
Used in 55 crates (2 directly)

MIT license

5MB
70K SLoC

C 64K SLoC // 0.1% comments Rust 3.5K SLoC // 0.0% comments Shell 1K SLoC // 0.2% comments Automake 580 SLoC // 0.0% comments Python 386 SLoC // 0.1% comments C++ 286 SLoC // 0.2% comments M4 168 SLoC // 0.4% comments Batch 76 SLoC Go 20 SLoC // 0.4% comments

Contains (JAR file, 59KB) vendor/gradle/wrapper/gradle-wrapper.jar, (obscure autoconf code, 29KB) vendor/configure.ac, (JAR file, 3KB) vendor/swig/libwebp.jar

libwebp-sys

bindgen'd FFI bindings to libwebp.

libwebp is built with the cc crate. It needs a C compiler, but cmake is not used.

Set TARGET_CPU env var to native or your desired CPU architecture to optimize the C code for it.

Usage

Add the following to the Cargo.toml in your project:

[dependencies]
libwebp-sys = "0.9"

or to require newer CPUs with SIMD support:

[dependencies]
libwebp-sys = { version = "0.9", features = ["avx2", "sse41", "neon"] }

or to require no_std support:

libwebp-sys = { version = "0.9", default-features = false, features = ["parallel", "neon"] }

Examples

Encode

pub fn encode_webp(input_image: &[u8], width: u32, height: u32, quality: i32) -> Result<Vec<u8>> {
    unsafe {
	    let mut out_buf = std::ptr::null_mut();
	    let stride = width as i32 * 4;
	    let len = WebPEncodeRGBA(input_image.as_ptr(), width as i32, height as i32, stride, quality as f32, &mut out_buf);
	    Ok(std::slice::from_raw_parts(out_buf, len as usize).into())
    }
}

Decode

pub fn decode_webp(buf: &[u8]) -> Result<Vec<u8>> {
	let mut width = 0;
	let mut height = 0;
	let len = buf.len();
	unsafe {
		WebPGetInfo(buf.as_ptr(), len, &mut width, &mut height);
		let out_buf = WebPDecodeRGBA(buf.as_ptr(), len, &mut width, &mut height);
	}
	Ok(std::slice::::from_raw_parts(out_buf, width * height * 4).into())
}

No runtime deps