Has my motd gone too far? It loads a random ANSI catgirl from a folder. I use arch btw, server runs minimized Ubuntu Server.
Has my motd gone too far? It loads a random ANSI catgirl from a folder. I use arch btw, server runs minimized Ubuntu Server.
Thanks for the suggestion, gonna look into this. I didn’t want to use real images even though kitty supports them because I like the retro look and wanted it terminal agnostic for when I use termux on my phone.
I gladly present you this jank.
You might need these to compile:
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(()) }
It’s beautiful! I actually adjusted my python code to your method and just for optimization checked if the current two pixel colors match the previous two and if so leave out the color info. Much more fidelity in the images now!