///|
fn main raise {
let window = @exr.Window::new(100, 200, 131, 232)
let channels : Array[@exr.Channel] = [
{ name: "sample.id", kind: U32, linear: true, },
{ name: "sensor.signal", kind: F32, linear: true, },
]
let writer = @exr.Writer::new(window, channels, metadata=[
@exr.Attribute::text("sensor.units", "relative intensity"),
@exr.Attribute::integer("acquisition.frame", 7),
])
let mut row = 0
while row < window.height() {
let n = if window.height() - row < 5 { window.height() - row } else { 5 }
let batch_window = @exr.Window::new(100, 200 + row, 131, 200 + row + n - 1)
let image = @exr.Image::new(batch_window, [
@exr.Plane::from_values(
channels[0],
batch_window,
Array::makei(32 * n, i => 4294967295.0 - (row * 32 + i).to_double()),
),
@exr.Plane::from_values(
channels[1],
batch_window,
Array::makei(32 * n, i => (row * 32 + i).to_double() / 2.0),
),
])
writer.push(image)
row += n
}
let file = @exr.ExrFile::open(writer.finish())
let scan = file.scan(channels=Some(["sensor.signal"]), batch_rows=3)
let mut pixels = 0
let mut sum = 0.0
while scan.next() is Some(batch) {
let plane = batch.plane("sensor.signal")
let stats = plane.statistics()
pixels += stats.samples
sum += stats.mean.unwrap() * stats.finite_samples.to_double()
}
assert_eq(pixels, 1056)
assert_eq(sum, 278520.0)
assert_eq(scan.chunks_decoded(), 3)
assert_eq(file.read().plane("sample.id").bits_at(100, 200), 4294967295U)
assert_eq(
file.header().attribute("sensor.units").unwrap().as_text(),
"relative intensity",
)
println(
"scientific imaging: row-batch acquisition, exact UINT IDs, metadata and chunk-backed finite analysis verified",
)
}