shared/utils/
image.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
use image::{ImageBuffer, Rgb};

use crate::types::{pixel_intensity::PixelIntensity, resolution::Resolution};

use super::{colors_utils::color, env_utils::get_env_var_as_u16};

pub fn image_from_pixel_intensity(
    pixel_intensity: Vec<PixelIntensity>,
) -> Result<ImageBuffer<Rgb<u8>, Vec<u8>>, Box<dyn std::error::Error>> {
    let width = get_env_var_as_u16("RESOLUTION_WIDTH")?;
    let height = get_env_var_as_u16("RESOLUTION_HEIGHT")?;

    let resolution = Resolution::new(width, height);
    let mut img = ImageBuffer::new(resolution.nx.into(), resolution.ny.into());
    for (i, pixel_intensity) in pixel_intensity.iter().enumerate() {
        let x = (i as u32) % resolution.nx as u32;
        let y = (i as u32) / resolution.nx as u32;
        img.put_pixel(x, y, Rgb(color(*pixel_intensity)));
    }

    Ok(img)
}