13 个版本

0.10.9 2024 年 7 月 7 日
0.10.7 2024 年 3 月 5 日
0.10.5 2023 年 10 月 3 日
0.9.6 2023 年 6 月 17 日
0.8.5 2018 年 5 月 9 日

155图像

Download history 2769/week @ 2024-05-04 2849/week @ 2024-05-11 2846/week @ 2024-05-18 2631/week @ 2024-05-25 3030/week @ 2024-06-01 2772/week @ 2024-06-08 2661/week @ 2024-06-15 2519/week @ 2024-06-22 3838/week @ 2024-06-29 2818/week @ 2024-07-06 3229/week @ 2024-07-13 3302/week @ 2024-07-20 3620/week @ 2024-07-27 4298/week @ 2024-08-03 3131/week @ 2024-08-10 2093/week @ 2024-08-17

13,820 每月下载量
用于 19 个 crate(13 个直接使用)

IJG 许可证

83KB
2K SLoC

Rust 对 MozJPEG 库的封装

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

接口仍在开发中,因此可能存在一些粗糙的边缘,可能会发生变化。

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

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

解码示例

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

    d.width(); // FYI
    d.height();
    d.color_space() == mozjpeg::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() == mozjpeg::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 = mozjpeg::Compress::new(mozjpeg::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)
});

依赖项

~5MB
~95K SLoC