simple_filters/
simple-filters.rs

1use pixtra::canvas::Canvas;
2use pixtra::pixels::Pixel;
3use std::path::Path;
4
5fn inverse(pixel: Pixel) -> Pixel {
6    Pixel {
7        r: u8::max_value() - pixel.r,
8        g: u8::max_value() - pixel.g,
9        b: u8::max_value() - pixel.b,
10        a: pixel.a,
11    }
12}
13
14fn unit_filter(canvas: &Canvas, x: u32, y: u32) -> Pixel {
15    canvas.get_pixel(x, y)
16}
17
18fn inverse_filter(canvas: &Canvas, x: u32, y: u32) -> Pixel {
19    inverse(canvas.get_pixel(x, y))
20}
21
22fn main() {
23    let canvas = Canvas::load(Path::new("assets/lena.png")).unwrap();
24    let filtered_canvas = canvas.filter(unit_filter);
25    let inverse_canvas = canvas.filter(inverse_filter);
26    let inverse_inverse_canvas = inverse_canvas.filter(inverse_filter);
27
28    assert_eq!(canvas, inverse_inverse_canvas);
29    assert_ne!(canvas, inverse_canvas);
30    println!(
31        "Normal and double inversed canvas are equal: {}",
32        canvas == inverse_inverse_canvas
33    );
34    println!(
35        "Normal and single inversed canvas are equal: {}",
36        canvas == inverse_canvas
37    );
38
39    let _ = filtered_canvas
40        .save(Path::new("filtered_canvas.png"))
41        .unwrap();
42    let _ = inverse_canvas
43        .save(Path::new("inverse_canvas.png"))
44        .unwrap();
45}