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 }
97
98 fn round(int: u32, multiple: u32) -> u32 {
99 return ((int + multiple - 1) / multiple) * multiple;
100 }
101}