Skip to content

bindgen'd FFI bindings to libwebp

Notifications You must be signed in to change notification settings

imazen/libwebp-sys

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

76 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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())
}

About

bindgen'd FFI bindings to libwebp

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Rust 99.8%
  • C 0.2%