17 unstable releases
Uses old Rust 2015
0.9.4 | Sep 18, 2023 |
---|---|
0.9.2 | Jul 12, 2023 |
0.9.0 | Mar 20, 2023 |
0.8.0 | Sep 20, 2022 |
0.1.0 | Nov 7, 2017 |
#59 in Images
25,285 downloads per month
Used in 41 crates
(2 directly)
5MB
70K
SLoC
Contains (JAR file, 59KB) vendor/gradle/wrapper/gradle-wrapper.jar, (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())
}