#jpeg #decoder #color-scheme #jpeg-decoder

no-std makepad-zune-jpeg

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

1 个不稳定版本

0.3.17 2023年9月20日

#334图像

Download history 24/week @ 2024-04-22 15/week @ 2024-04-29 42/week @ 2024-05-06 28/week @ 2024-05-13 27/week @ 2024-05-20 26/week @ 2024-05-27 36/week @ 2024-06-03 40/week @ 2024-06-10 31/week @ 2024-06-17 35/week @ 2024-06-24 15/week @ 2024-07-08 37/week @ 2024-07-15 16/week @ 2024-07-22 23/week @ 2024-07-29 24/week @ 2024-08-05

每月100 次下载
8 个 crate 中使用(通过 makepad-widgets

MIT 或 Apache-2.0 或 Zlib

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 进行更多操作,请参阅库中的附加文档。

目标

实现的目标如下,按重要性排序:

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

非目标

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

功能

  • 一个相当快的 8x8 整数 IDCT。
  • 快速 Huffman 解码
  • 快速颜色转换函数。
  • 支持扩展颜色空间,如灰度图和 RGBA
  • 单线程解码。
  • 支持四组件 JPEG 和像 CMYK 这样的奇异颜色方案
  • 支持 no_std
  • BGR/BGRA 解码支持。

crate 功能

feature on 能力
x86 yes 启用 x86 特定指令,特别是 avxsse 以加速解码。
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 毫秒。

有关更详细的基准测试,请参阅带有基准测试的在线仓库 此处

依赖项