Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..51aa694 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,78 @@ +#![feature(slice_as_chunks, generic_const_exprs)] +use atools::prelude::*; +use exoquant::SimpleColorSpace; +use rand::{Rng, RngCore}; + +fn main() { + reemap(); + // eomap(); + // let mut rng = rand::thread_rng(); + // let pal = std::iter::repeat_with(|| { + // let a: [f32; 3] = std::array::from_fn(|_| rng.next_u64() as f32 / u64::MAX as f32); + // a.join(1.) + // }) + // .take(200) + // .collect::<Vec<_>>(); +} + +fn reemap() { + // let mut rng = rand::thread_rng(); + // let pal = std::iter::repeat_with(|| { + // let a: [f32; 3] = std::array::from_fn(|_| rng.next_u64() as f32 / u64::MAX as f32); + // a.join(1.) + // }) + // .take(5124) + // .collect::<Vec<_>>(); + let pal = fimg::Image::<Box<[f32]>, 4>::from(fimg::Image::open("../endesga.png").as_ref()); + let pal = pal.flatten(); + + /*let pal = [ + ] + .chunked::<3>() + .map(|x| x.join(255).map(|x| x as f32 * (1.0 / 255.0))); + */ + // println!("{pal:?}"); + + fimg::Image::<Box<[u8]>, 4>::from( + remapper::remap( + fimg::Image::<Box<[f32]>, 4>::from( + fimg::Image::<Vec<u8>, 4>::open("plane_4096_2048.png").as_ref(), + ) + .as_ref(), + &pal, + ) + .as_ref(), + ) + .save("yeee.png"); +} + +fn eomap() { + let x = fimg::Image::<Vec<u8>, 4>::open("../fimg/tdata/cat.png"); + let pal = fimg::Image::open("../endesga.png"); + let pal = pal.flatten(); + let res = exoquant::Remapper::new( + &pal.iter() + .map(|&[r, g, b, a]| exoquant::Color::new(r, g, b, a)) + .collect::<Vec<_>>(), + &SimpleColorSpace::default(), + &exoquant::ditherer::Ordered, + ) + .remap( + &x.chunked() + .map(|&[r, g, b, a]| exoquant::Color::new(r, g, b, a)) + .collect::<Vec<_>>(), + x.width() as usize, + ); + let (width, height) = (x.width() as usize, x.height() as usize); + let pixels = (0..width) + .flat_map(|x_| (0..height).map(move |y| (x_, y))) + .filter_map(move |(x_, y_)| match res[(height - y_ - 1) * width + x_] { + 0 => None, + x => Some(((x_, y_), x)), + }); + let mut preview = fimg::Image::build(x.width(), x.height()).fill([0; 3].join(255)); + for ((x, y), i) in pixels { + unsafe { preview.set_pixel(x as _, (height - y - 1) as _, pal[i as usize]) }; + } + preview.save("eoquan.png"); +} |