simple_filters/
simple-filters.rs1use 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}