25 个版本
0.5.0-rc2 | 2024 年 7 月 21 日 |
---|---|
0.5.0-rc0 | 2024 年 4 月 7 日 |
0.4.11 | 2023 年 12 月 2 日 |
0.4.0 | 2023 年 11 月 8 日 |
0.1.4 | 2022 年 6 月 16 日 |
#24 在 图像 中
565,335 每月下载量
在 176 个 crate (7 直接) 中使用
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
进行更多操作,请参阅库中的附加文档。
目标
实现以下目标,按重要性排序
- 安全性 - 在错误或无效输入时不崩溃。恐慌是可以的,但应在其报告时修复。仅使用
unsafe
进行 SIMD 内置函数,并且可以在编译时和运行时完全关闭。 - 速度 - 尽快获取数据,这意味着
- 在合理的情况下使用平台内嵌代码
- 精心编写的平台无关代码,允许编译器对其进行向量化。
- 回归测试。
- 监控程序的内存使用情况
- 可用性 - 提供类似不同颜色转换函数的实用函数。
非目标
- 与 libjpeg/libjpeg-turbo 完全相同的位结果永远不会是这个库的目标。JPEG 是一种有损格式,标准中指定了非常少的部分(即它不提供参考上采样和颜色转换算法)
功能
- 相当快的 8x8 整数 IDCT。
- 快速 Huffman 解码
- 快速颜色转换函数。
- 支持扩展色域,如灰度级和 RGBA
- 单线程解码。
- 支持四分量 JPEG 和像 CMYK 这样的异色方案
- 支持
no_std
- BGR/BGRA 解码支持。
crate 功能
功能 | 打开 | 能力 |
---|---|---|
x86 |
是 | 启用 x86 专用指令,特别是 avx 和 sse 以加速解码。 |
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 毫秒。
有关最新的基准测试,请参阅包含基准测试的在线仓库 此处