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

sys no-std libwebp-sys

绑定到 libwebp(bindgen,静态链接)

18 个版本

使用旧 Rust 2015

0.9.5 2024年2月19日
0.9.4 2023年9月18日
0.9.2 2023年7月12日
0.9.0 2023年3月20日
0.1.0 2017年11月7日

图像 中排名 78

Download history 7078/week @ 2024-04-09 7820/week @ 2024-04-16 8117/week @ 2024-04-23 7412/week @ 2024-04-30 9260/week @ 2024-05-07 8911/week @ 2024-05-14 6611/week @ 2024-05-21 6629/week @ 2024-05-28 5152/week @ 2024-06-04 7326/week @ 2024-06-11 7846/week @ 2024-06-18 6823/week @ 2024-06-25 6294/week @ 2024-07-02 7717/week @ 2024-07-09 5904/week @ 2024-07-16 7615/week @ 2024-07-23

每月下载量 28,412
用于 57 个crate(2 个直接使用)

MIT 许可证 MIT

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

包含 (JAR 文件,59KB) vendor/gradle/wrapper/gradle-wrapper.jar,(隐晦的 autoconf 代码,29KB) vendor/configure.ac,(JAR 文件,3KB) vendor/swig/libwebp.jar

libwebp-sys

使用 bindgen 将 FFI 绑定到 libwebp

libwebp 使用 cc crate 构建。它需要一个 C 编译器,但不使用 cmake

TARGET_CPU 环境变量设置为 native 或您所需的 CPU 架构以优化该 C 代码。

用法

将以下内容添加到您项目的 Cargo.toml

[dependencies]
libwebp-sys = "0.9"

或要求具有 SIMD 支持的新 CPU

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

或要求 no_std 支持

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

示例

编码

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

解码

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

无运行时依赖