diff --git a/src/bw.rs b/src/bw.rs new file mode 100644 index 0000000..079fc41 --- /dev/null +++ b/src/bw.rs @@ -0,0 +1,61 @@ +use image::RgbaImage; +use palette::{Hsl, Hsv, IntoColor, Lab, LinSrgb, Oklab, Srgb}; + +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum Method { + SrgbAverage, + LinSrgbAverage, + Hsl, + Hsv, + Cielab, + Oklab, +} + +impl Method { + fn to_bw(self, pixel: Srgb) -> Srgb { + match self { + Self::SrgbAverage => { + let value = (pixel.red + pixel.green + pixel.blue) / 3.0; + Srgb::new(value, value, value) + } + Self::LinSrgbAverage => { + let pixel: LinSrgb = pixel.into_color(); + let value = (pixel.red + pixel.green + pixel.blue) / 3.0; + LinSrgb::new(value, value, value).into_color() + } + Self::Hsl => { + let mut pixel: Hsl = pixel.into_color(); + pixel.saturation = 0.0; + pixel.into_color() + } + Self::Hsv => { + let mut pixel: Hsv = pixel.into_color(); + pixel.saturation = 0.0; + pixel.into_color() + } + Self::Cielab => { + let mut pixel: Lab = pixel.into_color(); + pixel.a = 0.5; + pixel.b = 0.5; + pixel.into_color() + } + Self::Oklab => { + let mut pixel: Oklab = pixel.into_color(); + pixel.a = 0.0; + pixel.b = 0.0; + pixel.into_color() + } + } + } +} + +pub fn bw(image: &mut RgbaImage, method: Method) { + for pixel in image.pixels_mut() { + let [r, g, b, _] = pixel.0; + let srgb = Srgb::new(r, g, b).into_format::(); + let srgb = method.to_bw(srgb).into_format::(); + pixel.0[0] = srgb.red; + pixel.0[1] = srgb.green; + pixel.0[2] = srgb.blue; + } +} diff --git a/src/lib.rs b/src/lib.rs index de43bab..6637eee 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,61 +1 @@ -use image::RgbaImage; -use palette::{Hsl, Hsv, IntoColor, Lab, LinSrgb, Oklab, Srgb}; - -#[derive(Clone, Copy, PartialEq, Eq)] -pub enum BwMethod { - SrgbAverage, - LinSrgbAverage, - Hsl, - Hsv, - Cielab, - Oklab, -} - -impl BwMethod { - fn to_bw(self, pixel: Srgb) -> Srgb { - match self { - Self::SrgbAverage => { - let value = (pixel.red + pixel.green + pixel.blue) / 3.0; - Srgb::new(value, value, value) - } - Self::LinSrgbAverage => { - let pixel: LinSrgb = pixel.into_color(); - let value = (pixel.red + pixel.green + pixel.blue) / 3.0; - LinSrgb::new(value, value, value).into_color() - } - Self::Hsl => { - let mut pixel: Hsl = pixel.into_color(); - pixel.saturation = 0.0; - pixel.into_color() - } - Self::Hsv => { - let mut pixel: Hsv = pixel.into_color(); - pixel.saturation = 0.0; - pixel.into_color() - } - Self::Cielab => { - let mut pixel: Lab = pixel.into_color(); - pixel.a = 0.5; - pixel.b = 0.5; - pixel.into_color() - } - Self::Oklab => { - let mut pixel: Oklab = pixel.into_color(); - pixel.a = 0.0; - pixel.b = 0.0; - pixel.into_color() - } - } - } -} - -pub fn bw(image: &mut RgbaImage, method: BwMethod) { - for pixel in image.pixels_mut() { - let [r, g, b, _] = pixel.0; - let srgb = Srgb::new(r, g, b).into_format::(); - let srgb = method.to_bw(srgb).into_format::(); - pixel.0[0] = srgb.red; - pixel.0[1] = srgb.green; - pixel.0[2] = srgb.blue; - } -} +pub mod bw; diff --git a/src/main.rs b/src/main.rs index e2b1a4f..5af2199 100644 --- a/src/main.rs +++ b/src/main.rs @@ -5,6 +5,7 @@ use std::{ use clap::Parser; use image::{ImageFormat, RgbaImage}; +use mark::bw; #[derive(Debug, Clone, Copy, clap::ValueEnum)] enum BwMethod { @@ -16,15 +17,15 @@ enum BwMethod { Oklab, } -impl From for mark::BwMethod { +impl From for bw::Method { fn from(value: BwMethod) -> Self { match value { - BwMethod::SrgbAverage => mark::BwMethod::SrgbAverage, - BwMethod::LinSrgbAverage => mark::BwMethod::LinSrgbAverage, - BwMethod::Hsl => mark::BwMethod::Hsl, - BwMethod::Hsv => mark::BwMethod::Hsv, - BwMethod::Cielab => mark::BwMethod::Cielab, - BwMethod::Oklab => mark::BwMethod::Oklab, + BwMethod::SrgbAverage => bw::Method::SrgbAverage, + BwMethod::LinSrgbAverage => bw::Method::LinSrgbAverage, + BwMethod::Hsl => bw::Method::Hsl, + BwMethod::Hsv => bw::Method::Hsv, + BwMethod::Cielab => bw::Method::Cielab, + BwMethod::Oklab => bw::Method::Oklab, } } } @@ -38,7 +39,7 @@ struct BwCmd { impl BwCmd { fn run(self, mut image: RgbaImage) -> RgbaImage { - mark::bw(&mut image, self.method.into()); + bw::bw(&mut image, self.method.into()); image } }