#[macro_use]
extern crate smallvec;
extern crate rand;
extern crate half;
use std::convert::TryInto;
extern crate exr;
use exr::prelude::*;
use std::io::{BufWriter};
use std::fs::File;
use exr::meta::attributes::{Channel, PixelType, LineOrder, TileDescription, LevelMode};
use exr::meta::Blocks;
use exr::math::RoundingMode;
fn main() {
let random_values: Vec<f32> = (0..64)
.map(|_| rand::random::<f32>())
.collect();
let size = Vec2(2048*8, 2048*8);
let file = BufWriter::new(File::create("C:/Users/Johannes/Desktop/3GB.exr").unwrap());
let header = exr::meta::Header::new(
"test-image".try_into().unwrap(),
size,
smallvec![
Channel::new("B".try_into().unwrap(), PixelType::F32, true),
Channel::new("G".try_into().unwrap(), PixelType::F32, true),
Channel::new("R".try_into().unwrap(), PixelType::F32, true),
],
);
let header = header.with_encoding(
Compression::Uncompressed,
Blocks::Tiles(TileDescription {
tile_size: Vec2(64, 64),
level_mode: LevelMode::Singular,
rounding_mode: RoundingMode::Down
}),
LineOrder::Increasing
);
let meta = MetaData::new(smallvec![ header ]);
let mut count_to_1000_and_then_print = 0;
let start_time = ::std::time::Instant::now();
exr::image::write_all_lines_to_buffered(
file,
meta,
|_meta, line_mut|{
let chan = line_mut.location.channel;
line_mut.write_samples(|sample_index| random_values[(sample_index + chan) % random_values.len()])
},
WriteOptions {
parallel_compression: false,
pedantic: true,
on_progress: |progress, bytes| {
count_to_1000_and_then_print += 1;
if count_to_1000_and_then_print == 1000 {
count_to_1000_and_then_print = 0;
let mega_bytes = bytes / 1000000;
let percent = (progress * 100.0) as usize;
println!("progress: {}%, wrote {} megabytes", percent, mega_bytes);
}
Ok(())
},
}
).unwrap();
let duration = start_time.elapsed();
let millis = duration.as_secs() * 1000 + duration.subsec_millis() as u64;
println!("\nWrote exr file in {:?}s", millis as f32 * 0.001);
}