#webp #codec #encoder #decoder #image-processing #image-format #api-bindings

bin+lib webp-animation

WebP动画解码和编码的高级Rust包装器

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 图像

Download history 300/week @ 2024-03-13 250/week @ 2024-03-20 375/week @ 2024-03-27 428/week @ 2024-04-03 276/week @ 2024-04-10 439/week @ 2024-04-17 496/week @ 2024-04-24 363/week @ 2024-05-01 431/week @ 2024-05-08 500/week @ 2024-05-15 293/week @ 2024-05-22 237/week @ 2024-05-29 208/week @ 2024-06-05 251/week @ 2024-06-12 260/week @ 2024-06-19 271/week @ 2024-06-26

每月1,010次下载
用于 11 个crates (10个直接使用)

MIT/Apache

61KB
1K SLoC

webp-animation — 构建状态 最新版本 文档版本 代码行数

WebP动画解码和编码的高级Rust包装器

Example

查看 examples/encode_animation.rs 以获取上述图像编码的源代码 - 示例已转换为gif以支持所有浏览器,请参阅example.webp文件

底层WebP格式处理由基于C的libwebp库处理,该库通过Rust libwebp-sys2 crate进行接口操作。

功能目标

  • 易于使用的API,类似于Rust
  • 启用WebP流的解码和编码
  • 所有由libwebp提供的配置标志都应可使用

非功能目标

  • 高性能(接近libwebp的性能,但开销不大)
  • 编写全面的测试用例,并通过自动化进行测试
  • 确保安全性(无内存泄漏或UB)。API可安全使用

非目标

  • 提供其他WebP/libwebp相关功能(如图像编/解码或复用)。有关此功能,请参阅例如 libwebp-imagewebp

示例

解码

将接受一个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