use std::io::Write; use anyhow::Result; use base64::{engine::general_purpose, Engine}; use image::DynamicImage; pub struct Kitty; impl Kitty { pub fn image_show(img: DynamicImage) -> Result> { fn output(raw: Vec, format: u8, size: (u32, u32)) -> Result> { let b64 = general_purpose::STANDARD.encode(raw).chars().collect::>(); let mut it = b64.chunks(4096).peekable(); let mut buf = Vec::with_capacity(b64.len() + it.len() * 50); if let Some(first) = it.next() { write!( buf, "\x1b_Ga=d\x1b\\\x1b_Ga=T,f={},s={},v={},m={};{}\x1b\\", format, size.0, size.1, it.peek().is_some() as u8, first.iter().collect::(), )?; } while let Some(chunk) = it.next() { write!( buf, "\x1b_Gm={};{}\x1b\\", it.peek().is_some() as u8, chunk.iter().collect::() )?; } Ok(buf) } let size = (img.width(), img.height()); match img { DynamicImage::ImageRgb8(v) => output(v.into_raw(), 24, size), DynamicImage::ImageRgba8(v) => output(v.into_raw(), 32, size), v => output(v.to_rgb8().into_raw(), 24, size), } } #[inline] pub fn image_hide() -> &'static [u8; 8] { b"\x1b_Ga=d\x1b\\" } }