25个版本 (稳定版)

2.0.0 2023年7月8日
1.72.0 2024年2月4日
1.71.0 2023年9月18日
1.7.0 2023年7月8日
0.7.3 2020年3月15日

#1 in 多媒体

Download history 130837/week @ 2024-04-22 142777/week @ 2024-04-29 130149/week @ 2024-05-06 150609/week @ 2024-05-13 158123/week @ 2024-05-20 147132/week @ 2024-05-27 155873/week @ 2024-06-03 148239/week @ 2024-06-10 139272/week @ 2024-06-17 134971/week @ 2024-06-24 128289/week @ 2024-07-01 154599/week @ 2024-07-08 156135/week @ 2024-07-15 162498/week @ 2024-07-22 171543/week @ 2024-07-29 156674/week @ 2024-08-05

658,369 每月下载量
用于 45 个Crates(7个直接使用)

BSD-3-Clause

1.5MB
10K SLoC

Rust Docs Rust Crate Rust Lang Version Wasm Ready downloads Lines of Code

EXRS

这个库是一个100% Rust和100%安全代码库,用于读取和写入OpenEXR图像。

OpenEXR 是动画、VFX和其他计算机图形管道中的事实上的标准图像格式,因为它可以使用无损压缩表示大量像素数据。

功能包括

  • 任何数量的层可以放置在2D空间中的任何位置,就像在Photoshop中一样
  • 图像中的任何一组通道(rgb、xyz、lab、深度、运动、蒙版、任何东西等)
  • 每个通道有三种高动态范围值(16位浮点、32位浮点、32位无符号整数)
  • 未压缩的像素数据,以便快速访问文件
  • 对任何图像类型进行无损压缩
  • 对非深度图像类型进行有损压缩以生成非常小的文件
  • 在不处理整个文件的情况下加载图像的特定部分
  • 并行地在多个线程上压缩和解压缩图像像素
  • 可以向任何图像添加任意元数据,包括自定义字节数据,具有完全向后兼容性
  • 每个像素可以有任意数量的样本(“深度数据”)(目前尚未支持)

当前状态

这个库已经相当成熟,但仍然应该被视为不完整。例如,深度数据和DWA压缩算法尚未支持。

如果您遇到无法通过此crate打开但应该可以打开的exr文件,请在仓库中提交一个问题,包含图像文件。

重点是支持所有功能和正确性;一些性能优化需要完成。

我们能做什么

  • 支持的OpenEXR功能

    • 自定义属性
    • 多部分图像(多个层,如Photoshop)
    • 多分辨率图像(mip贴图、rip贴图)
    • 独立访问元数据和原始像素块
    • 自动裁剪掉图像中的透明像素(可选)
    • 通道子采样
    • 深度数据
    • 压缩方法
      • 未压缩的
      • zip线(无损)
      • zip块(无损)
      • rle(无损)
      • piz(无损)(非常感谢 @dgsantana)
      • pxr24 (支持 f16 和 u32 的无损压缩)
        • 小端架构
        • 大端架构 (需要帮助)
      • b44, b44a (感谢 @narann)
      • dwaa, dwab (需要帮助)
  • 优点

    • 无不安全代码,无未定义行为
    • 无需 CMake 或环境变量
    • 重新构想的 exr api,入门门槛低(参见 read_rgba_filewrite_rgba_fileread_all_data_from_file),同时采用常见的 Rust 高级抽象
    • 一个完整的图像数据结构,可以包含任何 exr 图像,可以通过一个函数调用打开任何图像(read_all_data_from_file),无需事先了解文件内容
    • 并行或低内存开销地解压缩和解压缩图像块
    • 读写进度回调
    • 按顺序写入块流
    • 使用泛型 std::io::Readstd::io::Write 特性自动支持内存映射

用法

[!TIP] 如果您想使用较老版本的 Rust 来使用 exrs 的新版本,仍然可以这样做,通过强制 Rust 使用较旧的 half 包版本,通过 cargo update -p half --precise 2.2.1,或者通过 cargo +nightly -Zminimal-versions generate-lockfile 降级所有依赖项。版本 half 2.3.0 及以上版本 MSRV 超过 1.61。

将以下内容添加到您的 Cargo.toml

[dependencies]
exr = "1.72.0"

# also, optionally add this to your crate for smaller binary size
# and better runtime performance
[profile.release]
lto = true

此存储库的 master 分支始终与 crates.io 版本匹配,因此您还可以链接到 github 存储库的 master 分支。

示例

示例:生成 rgb exr 文件

extern crate exr;

/// To write your image data, you need to specify how to retrieve a single pixel from it.
/// The closure may capture variables or generate data on the fly.
fn main() {
    use exr::prelude::*;

    // write a file, with 32-bit float precision per channel
    write_rgba_file(

        // this accepts paths or &str
        "minimal_rgba.exr",

        // image resolution is 2k
        2048, 2048,

        // generate (or lookup in your own image)
        // an f32 rgb color for each of the 2048x2048 pixels
        // (you could also create f16 values here to save disk space)
        |x,y| {
            (
                x as f32 / 2048.0, // red
                y as f32 / 2048.0, // green
                1.0 - (y as f32 / 2048.0), // blue
                1.0 // alpha
            )
        }

    ).unwrap();
}

查看 示例文件夹 以获取更多示例。

或阅读 指南

目标

exrs 的目标是提供一个安全、方便的接口来访问 OpenEXR 文件格式。它旨在最大限度地减少无效文件和运行时错误的可能性。它包含一个完整的图像数据结构,可以包含任何 exr 图像,同时也提供低级块接口的访问。

此库不试图成为一个通用的图像文件或图像处理库。因此,颜色转换、美丽的子采样和多级细节生成目前留给了其他包。由于原始 OpenEXR 实现支持这些操作,此库可能以后会支持它们。此外,此实现不试图产生与原始实现完全匹配的字节精确文件输出,而是只针对正确的输出。

安全性

此库不使用不安全代码。实际上,此包用 #[forbid(unsafe_code)] 标注。尽管如此,通过仔细选择依赖项,已经最大限度地减少了使用不安全代码。

所有文件信息都需谨慎处理。分配有安全最大值,一次性不会超过,以减少内存耗尽攻击。

我引以为豪的地方

  • 灵活的API(选择如何存储您的数据,而不是接收一个分配的图像)
  • 安全的API(几乎不可能意外写入无效文件)
  • “如果编译成功,则运行”的方法
  • 出色的贡献者!

Wasm

此包支持 wasm-unknown-unknown 目标。由于WASM目前没有线程,对压缩文件的解码和编码将更慢。当然,您需要从字节缓冲区而不是文件句柄中读取。

动机

此库不支持仅为了切换语言而将现有的C++代码重写为Rust的有害思维定式。OpenEXR图像格式由一个经过验证和实战测试的参考实现定义。

然而,作为官方参考实现的替代方案,此库有机会探索根本不同的设计,无论使用什么语言编写。太棒了!

此外,我真的想在我git仓库中有一个名字中有'X'的库。

请注意,有官方Rust绑定到C++参考实现,并且它们与这个Rust实现相比有多个优势

  • 它们支持所有功能,可以读取任何文件,不会出现惊喜
  • 它们由行业巨头不断推动,因此它们有更高的可能性在未来十年内仍然得到维护
  • 它们经过实战测试,并被许多现有项目依赖

规范

此库是根据官方的 OpenEXRFileLayout.pdf 文档构建的。未指定的行为从C++库中得出。

路线图

  1. 支持所有压缩格式(缺失格式:DWAA/DWAB)
  2. 支持子采样
  3. 支持深度数据
  4. 自动转换颜色空间
  5. 性能分析和其他优化
  6. 工具(图像查看器应用、元数据提取工具等)

贡献

此项目有出色的贡献者,欢迎在Github上贡献。

运行测试

要在您的本地系统上运行所有快速测试,请使用 cargo test

要在您的本地系统上无限期地开始模糊测试,请使用 cargo test --package exr --test fuzz fuzz -- --exact --ignored

要在仿真系统上运行所有快速测试,请使用以下命令之一。每个命令都需要一个运行的 docker 实例,并在您的机器上安装 cross-rscargo install cross)。

  • Mips(大端) cross test --target mips-unknown-linux-gnu --verbose

要基准测试库,只需运行 cargo bench

依赖项

~1.5MB
~27K SLoC