Rust有哪些好用的图片压缩库

最近在做一个需要用Rust处理图片的项目,需要压缩图片减小体积。请问Rust生态中有哪些好用的图片压缩库?最好能支持常见的格式如JPEG、PNG,并且压缩效果和性能都不错的。如果有使用示例或对比评测就更好了。

2 回复

推荐几个Rust图片压缩库:

  1. image - 最常用,支持多种格式和压缩算法
  2. mozjpeg - 专门针对JPEG优化,压缩效果好
  3. oxipng - PNG优化工具,无损压缩
  4. webp - Google的WebP格式支持

其中image库功能最全面,适合日常使用。


在 Rust 生态中,有几个高效且易用的图片压缩库,以下是主要推荐:

1. image

  • 特点:Rust 官方推荐的图像处理库,支持多种格式(如 JPEG、PNG、WebP),提供压缩、缩放和格式转换功能。
  • 适用场景:通用图像处理,压缩效果可通过调整质量参数实现。
  • 示例代码
    use image::{ImageOutputFormat, load_from_memory};
    
    fn compress_image(data: &[u8]) -> Vec<u8> {
        let img = load_from_memory(data).unwrap();
        let mut compressed = Vec::new();
        img.write_to(&mut compressed, ImageOutputFormat::Jpeg(85)).unwrap(); // JPEG 质量 85%
        compressed
    }
    

2. mozjpeg

  • 特点:基于 MozJPEG 的绑定,专注于 JPEG 高效压缩,支持渐进式编码和优化。
  • 适用场景:需要高质量 JPEG 压缩,例如网页图片优化。
  • 示例代码
    use mozjpeg::{Compress, ColorSpace};
    
    fn compress_jpeg(data: &[u8], width: u32, height: u32) -> Vec<u8> {
        let mut comp = Compress::new(ColorSpace::JCS_RGB);
        comp.set_size(width as usize, height as usize);
        comp.set_quality(80.0); // 设置压缩质量
        comp.set_optimize_scans(true);
        comp.start_compress();
        comp.write_scanlines(data);
        comp.finish_compress().unwrap()
    }
    

3. oxipng

  • 特点:无损 PNG 优化工具,通过减少文件大小而不损失质量。
  • 适用场景:PNG 图片压缩,支持多线程处理。
  • 示例代码
    use oxipng::{optimize_from_memory, Options};
    
    fn compress_png(data: &[u8]) -> Vec<u8> {
        let options = Options::default(); // 可自定义压缩级别
        optimize_from_memory(data, &options).unwrap()
    }
    

4. webp

  • 特点:WebP 格式编码库,支持有损和无损压缩,通常比 JPEG/PNG 更高效。
  • 适用场景:现代 Web 应用,追求更高压缩率。
  • 示例代码
    use webp::{Encoder, WebPMemory};
    
    fn encode_webp(data: &[u8], width: u32, height: u32) -> WebPMemory {
        let encoder = Encoder::from_rgb(data, width, height);
        encoder.encode(85.0) // 质量参数 0-100
    }
    

选择建议:

  • 通用压缩:使用 image 库,简单灵活。
  • JPEG 优化mozjpeg 适合高质量需求。
  • PNG 无损压缩oxipng 是首选。
  • 现代格式webp 适合 Web 环境。

根据具体格式和需求选择合适的库,多数可通过 Cargo.toml 直接添加依赖使用。

回到顶部