From 4ccdf827919558f747b01b9d76e574f9db2718fd Mon Sep 17 00:00:00 2001 From: Jay Kickliter Date: Wed, 15 Jan 2025 15:55:11 -0700 Subject: [PATCH] [nasadem] make image a feautre --- Cargo.toml | 1 + nasadem/Cargo.toml | 5 +++++ nasadem/src/lib.rs | 25 +++++++++++++++++++++++++ nasadem/zorderize/Cargo.toml | 4 ++-- nasadem/zorderize/src/main.rs | 20 +------------------- 5 files changed, 34 insertions(+), 21 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7f37f2d..9ced269 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,7 @@ clap = { version = "4.4.2", features = ["derive"] } criterion = { version = "0.5", features = ["html_reports"] } dashmap = "5.5.3" geo = "0.26.0" +image = "0" log = "0.4.20" memmap2 = "0.7.1" num-traits = "0.2.16" diff --git a/nasadem/Cargo.toml b/nasadem/Cargo.toml index b85d120..16fc7c2 100644 --- a/nasadem/Cargo.toml +++ b/nasadem/Cargo.toml @@ -10,8 +10,13 @@ readme = "README.md" repository = "https://github.com/jaykickliter/geoprof" version = "0.1.0" +[features] +default = [] +image = ["dep:image"] + [dependencies] byteorder = { workspace = true } geo = { workspace = true } memmap2 = { workspace = true } thiserror = { workspace = true } +image = { workspace = true, optional = true } diff --git a/nasadem/src/lib.rs b/nasadem/src/lib.rs index 99b654f..09e4af2 100755 --- a/nasadem/src/lib.rs +++ b/nasadem/src/lib.rs @@ -17,6 +17,8 @@ use geo::{ geometry::{Coord, Polygon}, polygon, }; +#[cfg(feature = "image")] +use image::{ImageBuffer, Luma}; use memmap2::Mmap; use std::{ fs::File, @@ -307,6 +309,29 @@ impl Tile { (x: w, y: s), ] } + + /// Returns an [image] of this tile. + /// + /// [image]: image::ImageBuffer + #[cfg(feature = "image")] + // https://docs.rs/image/latest/image/struct.ImageBuffer.html + pub fn to_image(&self) -> ImageBuffer, Vec> { + let (x_dim, y_dim) = self.dimensions(); + let mut img = ImageBuffer::new(x_dim as u32, y_dim as u32); + let min_elev = self.min_elevation() as f32; + let max_elev = self.max_elevation() as f32; + let scale = |m: i16| { + let m = m as f32; + (m - min_elev) / (max_elev - min_elev) * u16::MAX as f32 + }; + for sample in self.iter() { + let (x, y) = sample.index(); + let elev = sample.elevation(); + let scaled_elev = scale(elev); + img.put_pixel(x as u32, (y_dim - 1 - y) as u32, Luma([scaled_elev as u16])) + } + img + } } /// Private API diff --git a/nasadem/zorderize/Cargo.toml b/nasadem/zorderize/Cargo.toml index 1c2cac8..f568d1f 100644 --- a/nasadem/zorderize/Cargo.toml +++ b/nasadem/zorderize/Cargo.toml @@ -6,5 +6,5 @@ edition = "2021" [dependencies] clap = { workspace = true } glob = "0" -image = "0" -nasadem = { path = ".." } +image = { workspace = true } +nasadem = { path = "..", features = ["image"] } diff --git a/nasadem/zorderize/src/main.rs b/nasadem/zorderize/src/main.rs index 1bcdc09..6e13c02 100644 --- a/nasadem/zorderize/src/main.rs +++ b/nasadem/zorderize/src/main.rs @@ -14,24 +14,6 @@ struct Cmd { dest: Option, } -fn tile_to_img(tile: &Tile) -> ImageBuffer, Vec> { - let (x_dim, y_dim) = tile.dimensions(); - let mut img = ImageBuffer::new(x_dim as u32, y_dim as u32); - let min_elev = tile.min_elevation() as f32; - let max_elev = tile.max_elevation() as f32; - let scale = |m: i16| { - let m = m as f32; - (m - min_elev) / (max_elev - min_elev) * u16::MAX as f32 - }; - for sample in tile.iter() { - let (x, y) = sample.index(); - let elev = sample.elevation(); - let scaled_elev = scale(elev); - img.put_pixel(x as u32, (y_dim - 1 - y) as u32, Luma([scaled_elev as u16])) - } - img -} - fn scale_to_pow2(img: &ImageBuffer, Vec>) -> ImageBuffer, Vec> { let (scaled_x, scaled_y) = match img.dimensions() { (1201, 1201) => (1024, 1024), @@ -44,7 +26,7 @@ fn scale_to_pow2(img: &ImageBuffer, Vec>) -> ImageBuffer