2个不稳定版本

0.5.0-rc02024年4月7日
0.4.0 2023年11月12日

#7 in #hdr

Download history 99/week @ 2024-04-28 86/week @ 2024-05-05 95/week @ 2024-05-12 191/week @ 2024-05-19 122/week @ 2024-05-26 478/week @ 2024-06-02 285/week @ 2024-06-09 95/week @ 2024-06-16 37/week @ 2024-06-23 82/week @ 2024-06-30 64/week @ 2024-07-07 73/week @ 2024-07-14 76/week @ 2024-07-21 297/week @ 2024-07-28 208/week @ 2024-08-04 166/week @ 2024-08-11

761 每月下载量
2 crates 中使用

MIT OR Apache-2.0 OR Zlib

130KB
2K SLoC

zune-hdr

快速、小巧、通用的hdr解码器和编码器

此crate包含一个小巧且快速的辐射度(.hdr)解码器和编码器。

用法

要使用此crate,请将 zune-hdr 添加到您的 Cargo.toml 或运行 cargo add zune-hdr

以下是加载hdr图像的示例

use std::error::Error;
use std::fs::read;
use zune_hdr::HdrDeocder;

fn main() -> Result<(), Box<dyn Error>> {
    let contents = read("file.hdr")?;
    let data = HdrDecoder::new(contents);
    let pix: Vec<f32> = data.decode()?;
    println!("first pix:{}", pix[0]);
}

以下是写入hdr的示例,这将生成一个黑色图像

use zune_hdr::HdrEncoder;
use zune_core::options::EncoderOptions;

fn main() -> Result<(), Box<dyn Error>> {
    let w = 100;
    let h = 100;
    let comp = 3;

    let in_size: Vec<f32> = vec![0.0; w * h * comp];
    // setup options, we specify width and height here which are needed, colorspace must always 
    // be rgb and the depth is f32, 
    let encoder_opts = EncoderOptions::new(w, h, ColorSpace::RGB, BitDepth::Float32);

    let encoder = HdrEncoder::new(&in_size, encoder_opts);
    encoder.encode()?;
}

性能

此crate拥有优化的解码器,其速度比 image-rs/hdr 解码器快约2.5倍,以下是在以下 图像 上的基准运行

可以使用以下方式复制

git clone
cd ./zune-image 
cargo bench --workspace "hdr"

格式化输出

字段 image-rs/hdr zune-hdr
时间 16.561 ms 6.4180 ms
thrpt 77.363 MiB/s 199.63 MiB/s

原始criterion输出

Running benches/decode_hdr.rs (deps/decode_hdr-b0d728bd626a2ee2)
hdr: Simple decode(memorial-hdr)/image-rs/hdr
time:   [16.542 ms 16.561 ms 16.581 ms]
thrpt:  [77.271 MiB/s 77.363 MiB/s 77.454 MiB/s]

hdr: Simple decode(memorial-hdr)/zune-image/hdr
time:   [6.3522 ms 6.4180 ms 6.4848 ms]
thrpt:  [197.58 MiB/s 199.63 MiB/s 201.70 MiB/s]

安全性

此crate已经经过大量模糊测试,并且CI每天都会进行模糊测试以捕获意外的错误

此crate不使用 unsafe 并使用 #[forbid(unsafe)] 以防止任何错误悄悄进入

依赖项