16个版本 (8个重大更新)
0.9.0 | 2023年10月7日 |
---|---|
0.8.0 | 2023年7月4日 |
0.7.0 | 2022年7月21日 |
0.5.0 | 2021年10月24日 |
0.2.2 | 2021年5月8日 |
#168 in 图像
每月1,010次下载
用于 11 个crates (10个直接使用)
61KB
1K SLoC
webp-animation —
WebP动画解码和编码的高级Rust包装器
查看 examples/encode_animation.rs
以获取上述图像编码的源代码 - 示例已转换为gif以支持所有浏览器,请参阅example.webp文件
底层WebP格式处理由基于C的libwebp库处理,该库通过Rust libwebp-sys2 crate进行接口操作。
功能目标
- 易于使用的API,类似于Rust
- 启用WebP流的解码和编码
- 所有由
libwebp
提供的配置标志都应可使用
非功能目标
- 高性能(接近
libwebp
的性能,但开销不大) - 编写全面的测试用例,并通过自动化进行测试
- 确保安全性(无内存泄漏或UB)。API可安全使用
非目标
- 提供其他WebP/libwebp相关功能(如图像编/解码或复用)。有关此功能,请参阅例如 libwebp-image 或 webp
示例
解码
将接受一个webp缓冲区,并尝试将其解码为帧(s)
use webp_animation::prelude::*;
let buffer = std::fs::read("./data/animated.webp").unwrap();
let decoder = Decoder::new(&buffer).unwrap();
for frame in decoder.into_iter() {
assert_eq!(frame.dimensions(), (400, 400));
// w * h * rgba
assert_eq!(frame.data().len(), 400 * 400 * 4);
// if feature `image` is enabled (not by default),
// one can convert data to [`Image::ImageBuffer`]
assert_eq!(
frame.into_image().unwrap().dimensions(),
(400, 400)
);
}
也可以通过 Decoder::new_with_options
提供更多的解码选项。
编码
将接受 n
帧作为输入。WebP二进制数据在结束时输出(封装到 WebPData
,它充当 &[u8]
)
use webp_animation::prelude::*;
// setup
let dimensions = (64, 32);
let bright_frame = [255, 255, 255, 255].repeat(64 * 32);
let dark_frame = [0, 0, 0, 255].repeat(64 * 32);
// init encoder. uses by default lossless encoding,
// for other alternatives see documentation about
// `new_with_options`
let mut encoder = Encoder::new(dimensions).unwrap();
// insert frames to specific (increasing) timestamps
for frame_idx in 0..5 {
let rgba_data = if frame_idx % 2 == 0 {
&bright_frame
} else {
&dark_frame
};
// (presentation) timestamp of the frame, should be in increasing order. represented in milliseconds
let frame_timestamp_ms = frame_idx * 170;
encoder.add_frame(rgba_data, frame_timestamp_ms).unwrap();
}
// final timestamp in milliseconds, until to the last frame is shown
let final_timestamp_ms = 1_000;
// get encoded webp data
let webp_data = encoder.finalize(final_timestamp_ms).unwrap();
std::fs::write("my_animation.webp", webp_data).unwrap();
有关其他编码选项的文档,例如有损编码,请参阅 文档。要调整选项,请使用 Encoder::new_with_options
方法。
未来计划
跟上 libwebp
的上游更改。
可能在未来提供一个用于处理WebP动画的全面CLI(转换、优化等)
许可
根据您的要求,受以下任一许可的约束
任选。
贡献
除非您明确声明,否则任何有意提交以包含在软件中的贡献,如Apache-2.0许可证中定义,应如上所述双重许可,不附加任何额外条款或条件。
依赖项
~3.5–7MB
~85K SLoC