1 个不稳定版本
0.1.0 | 2024 年 4 月 9 日 |
---|
#34 in #image-encoding
13MB
262K 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 进行了一些修改。