ptit/
lib.rs

1mod imagecrop;
2
3pub mod ptit {
4    use bytes::Bytes;
5    use image::{DynamicImage, GenericImageView, ImageError, Rgba};
6    use image::imageops::FilterType;
7    use reqwest;
8    use rgb2ansi256::rgb_to_ansi256;
9    use termsize::Size;
10
11    use crate::imagecrop::ImageCrop;
12
13    pub fn download(website: &str) -> Result<reqwest::Result<Bytes>, reqwest::Error> {
14        return match reqwest::blocking::get(website) {
15            Err(e) => Err(e),
16            Ok(r) => Ok(r.bytes())
17        };
18    }
19
20    pub fn load(img_bytes: Bytes) -> Result<DynamicImage, ImageError> {
21        return match image::load_from_memory(&img_bytes) {
22            Err(e) => Err(e),
23            Ok(r) => Ok(r)
24        };
25    }
26
27    pub fn resize(image: DynamicImage) -> DynamicImage {
28        let size = match termsize::get() {
29            None => Size { rows: 64, cols: 64 },
30            Some(t) => t
31        };
32
33        let width = (size.cols as u32 - 1) / 2 ;
34        let height = size.rows as u32 - 1;
35
36        return image.resize(
37            round(width, 2),
38            round(height, 2),
39            FilterType::Nearest,
40        )
41    }
42
43    pub fn crop(image: DynamicImage) -> DynamicImage {
44        let mut img = ImageCrop { img: image };
45        let (top_left_corner, bottom_right_corner) = img.calculate_corners();
46
47        return img.img.crop(
48            top_left_corner.x,
49            top_left_corner.y,
50            bottom_right_corner.x - top_left_corner.x,
51            bottom_right_corner.y - top_left_corner.y,
52        );
53    }
54
55    pub fn scan(image: DynamicImage, solid: bool) {
56        for y in 0..image.height() {
57            for x in 0..image.width() {
58                convert(image.get_pixel(x, y), solid);
59            }
60            println!()
61        }
62    }
63
64    pub fn convert(rgba: Rgba<u8>, solid: bool) {
65        #[allow(unreachable_patterns)]
66        let char = if solid {
67            '█'
68        } else {
69            match rgba.0[3] {
70                0 => ' ',
71                1..=64 => '░',
72                65..=128 => '▒',
73                129..=192 => '▓',
74                193..=255 => '█',
75                _ => '?'
76            }
77        };
78
79        for _ in 0..2 {
80            if rgba.0[3] > 0 {
81                print!(
82                    "\x1b[38;5;{:?}m{}\x1b[0m",
83                    rgb_to_ansi256(
84                        rgba.0[0],
85                        rgba.0[1],
86                        rgba.0[3],
87                    ),
88                    char
89                );
90            } else {
91                print!("{}", char)
92            }
93        }
94
95        // stdout().flush().unwrap();
96    }
97
98    fn round(int: u32, multiple: u32) -> u32 {
99        return ((int + multiple - 1) / multiple) * multiple;
100    }
101}