13 个版本
0.10.9 | 2024 年 7 月 7 日 |
---|---|
0.10.7 | 2024 年 3 月 5 日 |
0.10.5 | 2023 年 10 月 3 日 |
0.9.6 |
|
0.8.5 |
|
155 在 图像
13,820 每月下载量
用于 19 个 crate(13 个直接使用)
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