From a0d82499c0ff83e4d8b2267f52cf561421205f5d Mon Sep 17 00:00:00 2001 From: p6nj Date: Sun, 14 Jul 2024 07:57:40 +0200 Subject: [PATCH] reorganize lib, use it in the funny zone --- Cargo.toml | 1 + bent-funny-zone/src/main.rs | 28 +++++------ bingus/Cargo.toml | 1 + bingus/src/lib.rs | 89 +--------------------------------- bingus/src/rawdata.rs | 48 ++++++++++++++++++ bingus/src/rawdata/rgbimage.rs | 42 ++++++++++++++++ 6 files changed, 106 insertions(+), 103 deletions(-) create mode 100644 bingus/src/rawdata.rs create mode 100644 bingus/src/rawdata/rgbimage.rs diff --git a/Cargo.toml b/Cargo.toml index 56117cb..f0a268c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,3 +21,4 @@ rfd = "0.14.1" derive-new = "0.6.0" infer = "0.16.0" indicatif = { version = "0.17.8", features = ["rayon"] } +getset = "0.1.2" diff --git a/bent-funny-zone/src/main.rs b/bent-funny-zone/src/main.rs index 733408a..8681dac 100644 --- a/bent-funny-zone/src/main.rs +++ b/bent-funny-zone/src/main.rs @@ -1,11 +1,12 @@ use std::path::PathBuf; use anyhow::{Context, Result}; +use bingus::rawdata::rgbimage::RawImage; use dasp_sample::{Sample, U24}; use derive_new::new; use dirs::{download_dir, home_dir, picture_dir}; use fundsp::math::uparc; -use image::{io::Reader as ImageReader, ImageBuffer, ImageFormat, Rgb}; +use image::{io::Reader as ImageReader, ImageFormat, RgbImage}; use indicatif::{ParallelProgressIterator, ProgressStyle}; use rayon::{iter::ParallelIterator, slice::ParallelSlice}; use rfd::FileDialog; @@ -66,17 +67,15 @@ impl Files { fn main() -> Result<()> { let dp = DataPath::new(Files::prompt()?); - let img = ImageReader::open(dp.files.input)? - .decode() - .context("can't use this picture")? - .to_rgb8(); - let (width, height) = (img.width(), img.height()); - let processed: ImageBuffer, Vec> = ImageBuffer::from_raw( - width, - height, - img.into_raw() - .par_chunks_exact(3) - .progress_count((width * height).into()) + let img = RawImage::from( + ImageReader::open(dp.files.input)? + .decode() + .context("can't use this picture")?, + ); + let processed = RawImage::new( + *img.metadata(), + img.par_chunks_exact(3) + .progress_count((img.metadata().width() * img.metadata().height()).into()) .with_style(ProgressStyle::with_template( "[{eta}] {bar:40.green/red} {pos}/{len} pixels", )?) @@ -94,9 +93,8 @@ fn main() -> Result<()> { ] }) .collect(), - ) - .unwrap(); - processed.save(dp.files.output)?; + ); + RgbImage::from(processed).save(dp.files.output)?; // let bytes: Vec = (1u8..7).into_iter().collect(); // assert_eq!( diff --git a/bingus/Cargo.toml b/bingus/Cargo.toml index 00acf16..f51bb2c 100644 --- a/bingus/Cargo.toml +++ b/bingus/Cargo.toml @@ -12,3 +12,4 @@ keywords.workspace = true [dependencies] image = { workspace = true } derive-new = { workspace = true } +getset = { workspace = true } diff --git a/bingus/src/lib.rs b/bingus/src/lib.rs index 2a54c04..83808c4 100644 --- a/bingus/src/lib.rs +++ b/bingus/src/lib.rs @@ -1,88 +1 @@ -use std::{borrow::Cow, ops::Deref}; - -use derive_new::new; -use image::{DynamicImage, RgbImage}; - -type Bytes<'a> = Cow<'a, [u8]>; - -pub trait Metadata {} - -pub struct RawData<'a, M: Metadata> { - pub(crate) data: Bytes<'a>, - pub(crate) metadata: M, -} - -impl<'a, M> RawData<'a, M> -where - M: Metadata, -{ - fn metadata(&self) -> &M { - &self.metadata - } -} - -impl<'a, M> Deref for RawData<'a, M> -where - M: Metadata, -{ - type Target = Bytes<'a>; - fn deref(&self) -> &Self::Target { - &self.data - } -} - -impl<'a, M> From> for Vec -where - M: Metadata, -{ - fn from(value: RawData<'a, M>) -> Self { - value.data.into_owned() - } -} - -impl<'a, M> Clone for RawData<'a, M> -where - M: Metadata + Clone, -{ - fn clone(&self) -> Self { - Self { - data: self.data.clone(), - metadata: self.metadata().clone(), - } - } -} - -#[derive(new)] -pub struct ImageMetadata { - width: u32, - height: u32, -} -impl Metadata for ImageMetadata {} -pub type RawImage<'a> = RawData<'a, ImageMetadata>; - -impl From for RawImage<'_> { - fn from(value: DynamicImage) -> Self { - value.to_rgb8().into() - } -} - -impl From for RawImage<'_> { - fn from(value: RgbImage) -> Self { - let metadata = ImageMetadata::new(value.width(), value.height()); - Self { - data: Cow::Owned(value.into_raw()), - metadata, - } - } -} - -impl<'a> From> for RgbImage { - fn from(value: RawImage<'a>) -> Self { - RgbImage::from_raw( - value.metadata.width, - value.metadata.height, - value.data.to_vec(), - ) - .unwrap() - } -} +pub mod rawdata; diff --git a/bingus/src/rawdata.rs b/bingus/src/rawdata.rs new file mode 100644 index 0000000..98498d5 --- /dev/null +++ b/bingus/src/rawdata.rs @@ -0,0 +1,48 @@ +use std::{borrow::Cow, ops::Deref}; + +use derive_new::new; +use getset::Getters; + +pub mod rgbimage; + +type Bytes<'a> = Cow<'a, [u8]>; + +pub trait Metadata {} + +#[derive(new, Getters)] +pub struct RawData<'a, M: Metadata> { + #[getset(get = "pub")] + pub(crate) metadata: M, + pub(crate) data: Bytes<'a>, +} + +impl<'a, M> From> for Vec +where + M: Metadata, +{ + fn from(value: RawData<'a, M>) -> Self { + value.data.into_owned() + } +} + +impl<'a, M> Clone for RawData<'a, M> +where + M: Metadata + Clone, +{ + fn clone(&self) -> Self { + Self { + data: self.data.clone(), + metadata: self.metadata().clone(), + } + } +} + +impl<'a, M> Deref for RawData<'a, M> +where + M: Metadata, +{ + type Target = Bytes<'a>; + fn deref(&self) -> &Self::Target { + &self.data + } +} diff --git a/bingus/src/rawdata/rgbimage.rs b/bingus/src/rawdata/rgbimage.rs new file mode 100644 index 0000000..f5daf9c --- /dev/null +++ b/bingus/src/rawdata/rgbimage.rs @@ -0,0 +1,42 @@ +use derive_new::new; +use getset::Getters; +use image::{DynamicImage, RgbImage}; + +use super::*; + +#[derive(new, Getters, Clone, Copy)] +pub struct ImageMetadata { + #[getset(get = "pub")] + width: u32, + #[getset(get = "pub")] + height: u32, +} +impl Metadata for ImageMetadata {} +pub type RawImage<'a> = RawData<'a, ImageMetadata>; + +impl From for RawImage<'_> { + fn from(value: DynamicImage) -> Self { + value.to_rgb8().into() + } +} + +impl From for RawImage<'_> { + fn from(value: RgbImage) -> Self { + let metadata = ImageMetadata::new(value.width(), value.height()); + Self { + data: Cow::Owned(value.into_raw()), + metadata, + } + } +} + +impl<'a> From> for RgbImage { + fn from(value: RawImage<'a>) -> Self { + RgbImage::from_raw( + value.metadata.width, + value.metadata.height, + value.data.to_vec(), + ) + .unwrap() + } +}