#jpeg #decoder #jpeg-decoder

no-std zune-jpeg

一个快速、正确且安全的 JPEG 解码器

25 个版本

0.5.0-rc22024 年 7 月 21 日
0.5.0-rc02024 年 4 月 7 日
0.4.11 2023 年 12 月 2 日
0.4.0 2023 年 11 月 8 日
0.1.4 2022 年 6 月 16 日

#24图像

Download history 89776/week @ 2024-05-03 88227/week @ 2024-05-10 94419/week @ 2024-05-17 82451/week @ 2024-05-24 85784/week @ 2024-05-31 79395/week @ 2024-06-07 82675/week @ 2024-06-14 91514/week @ 2024-06-21 88927/week @ 2024-06-28 89056/week @ 2024-07-05 101907/week @ 2024-07-12 106018/week @ 2024-07-19 117897/week @ 2024-07-26 137508/week @ 2024-08-02 154267/week @ 2024-08-09 136072/week @ 2024-08-16

565,335 每月下载量
176 个 crate (7 直接) 中使用

MIT OR Apache-2.0 OR Zlib

350KB
6K SLoC

Zune-JPEG

一个使用纯 Rust 编写的快速、正确且安全的 JPEG 解码器。

用法

该库提供简单的 API 用于 JPEG 解码,并能够添加选项以影响解码。

示例

// Import the library
use zune_jpeg::JpegDecoder;
use std::fs::read;

fn main()->Result<(),DecoderErrors> {
    // load some jpeg data
    let data = read("cat.jpg").unwrap();
    // create a decoder
    let mut decoder = JpegDecoder::new(&data);
    // decode the file
    let pixels = decoder.decode()?;
}

解码器支持通过 DecoderOptions 进行更多操作,请参阅库中的附加文档。

目标

实现以下目标,按重要性排序

  1. 安全性 - 在错误或无效输入时不崩溃。恐慌是可以的,但应在其报告时修复。仅使用 unsafe 进行 SIMD 内置函数,并且可以在编译时和运行时完全关闭。
  2. 速度 - 尽快获取数据,这意味着
    1. 在合理的情况下使用平台内嵌代码
    2. 精心编写的平台无关代码,允许编译器对其进行向量化。
    3. 回归测试。
    4. 监控程序的内存使用情况
  3. 可用性 - 提供类似不同颜色转换函数的实用函数。

非目标

  • 与 libjpeg/libjpeg-turbo 完全相同的位结果永远不会是这个库的目标。JPEG 是一种有损格式,标准中指定了非常少的部分(即它不提供参考上采样和颜色转换算法)

功能

  • 相当快的 8x8 整数 IDCT。
  • 快速 Huffman 解码
  • 快速颜色转换函数。
  • 支持扩展色域,如灰度级和 RGBA
  • 单线程解码。
  • 支持四分量 JPEG 和像 CMYK 这样的异色方案
  • 支持 no_std
  • BGR/BGRA 解码支持。

crate 功能

功能 打开 能力
x86 启用 x86 专用指令,特别是 avxsse 以加速解码。
std 启用链接到 std crate

请注意,在编译时,如果平台不是x86,则自动禁用 x86 功能,因此如果您针对的是此类平台,则无需显式禁用它们。

no_std 环境中使用

可以使用 alloc 功能在 no_std 环境中使用此包。

但需要链接到将在其上运行的解码器环境的有效分配器

调试与发布

解码器在解码时严重依赖特定平台的内建函数,即 AVX2 和 SSE,以获得解码速度的提升,但在调试构建中表现不佳。性能不佳。为了在调试模式下编译程序时也能获得合理的性能,请将以下内容添加到您的 Cargo.toml 文件中:

# `zune-jpeg` package will be always built with optimizations
[profile.dev.package.zune-jpeg]
opt-level = 3

基准测试

该库试图尽可能快,同时尽可能安全。平台特定的内建函数有助于加快密集型操作,确保我们几乎可以匹配 libjpeg-turbo 的速度,但速度始终比这个库快或慢 10 毫秒。

有关最新的基准测试,请参阅包含基准测试的在线仓库 此处

依赖关系