1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
use crate::{renderer::mode::region_braille, BrailleArt, BrailleCanvas, Result};
use image::{DynamicImage, GenericImageView};
mod mode;
use image::io::Reader;
pub use mode::BrailleArtMode;
use std::{io::Cursor, path::Path};
impl BrailleArt {
pub fn render_path(&self, path: impl AsRef<Path>) -> Result<BrailleCanvas> {
let img = Reader::open(path)?.decode()?;
Ok(self.render(img))
}
pub fn render_bytes(&self, bytes: &[u8]) -> Result<BrailleCanvas> {
let img = Reader::new(Cursor::new(bytes)).decode()?;
Ok(self.render(img))
}
pub fn render(&self, img: DynamicImage) -> BrailleCanvas {
let (width, height) = img.dimensions();
let mat: Vec<Vec<bool>> =
(0..height).map(|y| (0..width).into_iter().map(|x| self.mode.is_on(&img, x, y)).collect()).collect();
let mut out = vec![];
for y in 0..=height / 4 {
let mut line = vec![];
for x in 0..=width / 2 {
let v = region_braille(x, y, |(y, x)| {
if !img.in_bounds(x, y) {
return None;
}
Some(mat[y as usize][x as usize])
});
line.push(std::char::from_u32(v).unwrap())
}
out.push(line)
}
BrailleCanvas { data: out }
}
}