25个版本 (稳定版)
2.0.0 |
|
---|---|
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 多媒体
658,369 每月下载量
用于 45 个Crates(7个直接使用)
1.5MB
10K SLoC
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_file
、write_rgba_file
、read_all_data_from_file
),同时采用常见的 Rust 高级抽象 - 一个完整的图像数据结构,可以包含任何 exr 图像,可以通过一个函数调用打开任何图像(
read_all_data_from_file
),无需事先了解文件内容 - 并行或低内存开销地解压缩和解压缩图像块
- 读写进度回调
- 按顺序写入块流
- 使用泛型
std::io::Read
和std::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++库中得出。
路线图
- 支持所有压缩格式(缺失格式:DWAA/DWAB)
- 支持子采样
- 支持深度数据
- 自动转换颜色空间
- 性能分析和其他优化
- 工具(图像查看器应用、元数据提取工具等)
贡献
此项目有出色的贡献者,欢迎在Github上贡献。
运行测试
要在您的本地系统上运行所有快速测试,请使用 cargo test
。
要在您的本地系统上无限期地开始模糊测试,请使用 cargo test --package exr --test fuzz fuzz -- --exact --ignored
。
要在仿真系统上运行所有快速测试,请使用以下命令之一。每个命令都需要一个运行的 docker
实例,并在您的机器上安装 cross-rs
(cargo install cross
)。
- Mips(大端)
cross test --target mips-unknown-linux-gnu --verbose
要基准测试库,只需运行 cargo bench
。
依赖项
~1.5MB
~27K SLoC