Documentation
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);
}