1 个不稳定版本

0.1.0 2024 年 4 月 9 日

#34 in #image-encoding

BSD-3-Clause

13MB
262K SLoC

C++ 125K SLoC // 0.1% comments C 83K SLoC // 0.2% comments Assembly 24K SLoC // 0.2% comments GNU Style Assembly 7K SLoC // 0.1% comments Bazel 6.5K SLoC // 0.1% comments Python 4K SLoC // 0.1% comments Java 3.5K SLoC // 0.4% comments Shell 3K SLoC // 0.2% comments Rust 3K SLoC // 0.0% comments JavaScript 1.5K SLoC // 0.1% comments Bitbake 1.5K SLoC // 0.0% comments Go 577 SLoC // 0.2% comments Forge Config 94 SLoC // 0.3% comments Batch 82 SLoC // 0.4% comments TypeScript 51 SLoC // 0.3% comments Objective-C 31 SLoC Automake 25 SLoC

基于 mozjpeg-rust 的 Rust 封装 Jpegli 库

此库在 jpegli 上添加了一个安全(更安全)的接口,用于读取和写入压缩良好的 JPEG 图像。

接口仍在开发中,因此可能有粗糙的边缘并且可能发生变化。

特别是,由于 libjpeg 的独特设计,错误处理很奇怪。错误处理不能使用 Result,而需要依赖于 Rust 的 resume_unwind(基本上是一个 panic)来指示 libjpeg 中的任何错误。需要将此库的所有使用封装在 catch_unwind 中。

在具有 panic=abort 设置的 crates 中编译时,任何 JPEG 错误都将终止进程。

解码示例

std::panic::catch_unwind(|| -> std::io::Result<Vec<rgb::RGB8>> {
    let d = jpegli::Decompress::with_markers(jpegli::ALL_MARKERS)
        .from_path("tests/test.jpg")?;

    d.width(); // FYI
    d.height();
    d.color_space() == jpegli::ColorSpace::JCS_YCbCr;
    for marker in d.markers() { /* read metadata or color profiles */ }

    // rgb() enables conversion
    let mut image = d.rgb()?;
    image.width();
    image.height();
    image.color_space() == jpegli::ColorSpace::JCS_RGB;

    let pixels = image.read_scanlines()?;
    image.finish()?;
    Ok(pixels)
});

编码示例

# let width = 8; let height = 8;
std::panic::catch_unwind(|| -> std::io::Result<Vec<u8>> {
    let mut comp = jpegli::Compress::new(jpegli::ColorSpace::JCS_RGB);

    comp.set_size(width, height);
    let mut comp = comp.start_compress(Vec::new())?; // any io::Write will work

    // replace with your image data
    let pixels = vec![0u8; width * height * 3];
    comp.write_scanlines(&pixels[..])?;

    let writer = comp.finish()?;
    Ok(writer)
});

感谢

非常感谢 mozjpeg-rust 库的原始作者,本库基于此库。

大部分代码都是从那里借用的,并对 jpegli 而不是 mozjpeg 进行了一些修改。

依赖关系