I gladly present you this jank.
You might need these to compile:
cargo add image
cargo add clap --features derive
And the jank itself:
Some Rust code
use std::path::PathBuf;
use clap::Parser;
use image::{ imageops::{self, FilterType}, ImageReader };
#[derive(Parser)]
struct Cli {
path: PathBuf,
#[arg(short = 'H', long, default_value_t = 30)]
height: u32,
#[arg(short, long, default_value_t = 0.4)]
ratio: f32,
#[arg(short, long, default_value_t, value_enum)]
filter: Filter,
}
#[derive(clap::ValueEnum, Clone, Default)]
enum Filter {
Nearest,
Triangle,
Gaussian,
CatmullRom,
#[default]
Lanczos3,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let args = Cli::parse();
let filter = match args.filter {
Filter::Nearest => { FilterType::Nearest },
Filter::Triangle => { FilterType::Triangle },
Filter::CatmullRom => { FilterType::CatmullRom },
Filter::Gaussian => { FilterType::Gaussian },
Filter::Lanczos3 => { FilterType::Lanczos3 },
};
let img = ImageReader::open(args.path)?.decode()?;
let original_ratio = img.width() as f32 / img.height() as f32;
let width = ( args.height as f32 / args.ratio ) * original_ratio;
let out = imageops::resize(&img, width as u32, args.height * 2, filter);
let mut iter = out.enumerate_rows();
while let Some((_, top)) = iter.next() {
let (_, bottom) = iter.next().unwrap();
top.zip(bottom)
.for_each(|((_, _, t), (_, _, b))| {
print!("\x1B[38;2;{};{};{};48;2;{};{};{}m\u{2584}", b[0], b[1], b[2], t[0], t[1], t[2])
});
println!("\x1B[0m");
}
Ok(())
}