use fft2d::slice::dcst::{dct_2d, idct_2d};
use image::GrayImage;
use show_image::create_window;
#[show_image::main]
fn main() -> Result<(), Box<dyn std::error::Error>> {
let img = image::open("data/mandrill.jpg")?.into_luma8();
let (width, height) = img.dimensions();
let mut img_buffer: Vec<f64> = img.as_raw().iter().map(|&pix| pix as f64 / 255.0).collect();
dct_2d(width as usize, height as usize, &mut img_buffer);
let half_width = width as usize / 2;
let half_height = height as usize / 2;
let mut half_buffer = vec![0.0; half_width * half_height];
for (half_col, column) in half_buffer
.chunks_exact_mut(half_height)
.zip(img_buffer.chunks_exact(height as usize))
{
half_col.copy_from_slice(&column[..half_height]);
}
idct_2d(half_height, half_width, &mut half_buffer);
let fft_coef = 4.0 / (width * height) as f64;
for x in half_buffer.iter_mut() {
*x *= fft_coef;
}
let img_raw: Vec<u8> = half_buffer
.iter()
.map(|x| (x.max(0.0).min(1.0) * 255.0) as u8)
.collect();
let out_img = GrayImage::from_raw(half_width as u32, half_height as u32, img_raw).unwrap();
let window_in = create_window("input", Default::default())?;
window_in.set_image("Input image", img)?;
let window_out = create_window("output", Default::default())?;
window_out.set_image("Resized image", out_img)?;
window_in.wait_until_destroyed()?;
Ok(())
}