1 个不稳定版本
0.3.17 | 2023年9月20日 |
---|
#334 在 图像
每月100 次下载
在 8 个 crate 中使用(通过 makepad-widgets)
320KB
5.5K SLoC
Zune-JPEG
一个纯 Rust 编写的快速、正确且安全的 JPEG 解码器。
用法
该库提供简单易用的 API 以进行 JPEG 解码,并能够添加选项以影响解码。
示例
// Import the library
use zune_jpeg::JpegDecoder;
use std::fs::read;
// 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().unwrap();
解码器支持通过 DecoderOptions
进行更多操作,请参阅库中的附加文档。
目标
实现的目标如下,按重要性排序:
- 安全性 - 在错误或无效输入时不崩溃。恐慌是可以接受的,但应在报告后修复。仅在
unsafe
中使用 SIMD 内置函数,并且可以在编译时和运行时完全关闭。 - 速度 - 尽快获取数据,这意味着
- 平台内建函数代码,如果合理的话
- 精心编写的平台无关代码,允许编译器进行向量化。
- 回归测试。
- 监控程序的内存使用情况
- 可用性 - 提供如不同颜色转换函数等实用函数。
非目标
- 与 libjpeg/libjpeg-turbo 具有位相同的结果永远不会是这个库的目标。JPEG 是一种有损格式,标准中指定了很少的部分(即它不提供参考上采样和颜色转换算法)
功能
- 一个相当快的 8x8 整数 IDCT。
- 快速 Huffman 解码
- 快速颜色转换函数。
- 支持扩展颜色空间,如灰度图和 RGBA
- 单线程解码。
- 支持四组件 JPEG 和像 CMYK 这样的奇异颜色方案
- 支持
no_std
- BGR/BGRA 解码支持。
crate 功能
feature | on | 能力 |
---|---|---|
x86 |
yes | 启用 x86 特定指令,特别是 avx 和 sse 以加速解码。 |
std |
yes | 启用链接到 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。特定于平台的内建函数有助于提高密集型操作的速度,确保我们几乎可以达到 libjpeg-turbo 的速度,但速度始终比此库快或慢约 10 毫秒。
有关更详细的基准测试,请参阅带有基准测试的在线仓库 此处