pub mod Filter;
use image::{DynamicImage, GenericImageView, ImageBuffer, Rgb, RgbImage};
use Filter::Filter_matrix;
pub fn multiply_by_matrix(image: DynamicImage, filter: Filter_matrix, repeat: i16) -> DynamicImage {
let image = image.clone();
let (width, height) = image.dimensions();
let mut image_after_filter: RgbImage = ImageBuffer::new(width, height);
let filter: Filter_matrix = filter;
let size = filter.matrix.len() as u32;
let shift = ((size / 2) as f32 - 0.5) as u32;
for i in 0..repeat {
for pixel in image.pixels() {
if pixel.0 >= size
&& pixel.0 < width - size
&& pixel.1 >= size
&& pixel.1 < height - size
{
let mut pixel_value: [i32; 3] = [0, 0, 0];
for c in 0..3 {
for k in 0..size {
for l in 0..size {
let color_pixel =
image.get_pixel(pixel.0 - shift + l, pixel.1 - shift + k).0;
pixel_value[c] += (color_pixel[c] as f32
* filter.matrix[l as usize][k as usize] as f32
* filter.extra_value)
as i32;
}
}
if pixel_value[c] > 255 {
pixel_value[c] = 255;
}
}
*image_after_filter.get_pixel_mut(pixel.0, pixel.1) = Rgb([
pixel_value[0] as u8,
pixel_value[1] as u8,
pixel_value[2] as u8,
]);
}
}
}
return image::DynamicImage::ImageRgb8(image_after_filter);
}