# PIC 📷 PIC (**P**review **I**mage in **C**LI ) is a lightweight Rust tool to preview images in your terminal!
With support for various image protocols ([`Kitty`](https://sw.kovidgoyal.net/kitty/graphics-protocol/), [`Sixel`](https://saitoha.github.io/libsixel/), [`iTerm`](https://iterm2.com/documentation-images.html)) it works in several terminals, and can still use Unicode blocks in case your terminal isn't supported. PIC also provides a library for you to use in your own tools! ## Features - Choose your favourite protocols * Kitty graphics with multiple actions available (`load`/`clear`) * Sixel which works in a lot of terminals * iTerm which displays GIFs incredibly well * Unicode blocks with truecolor/ansi256 support otherwise - Customization * `--x` and `--y` options to choose where to display your image * `--cols` and `--rows` options to choose the size of your image (always tries preserving ratio) * `--upscale` option to preview image at full wanted size if needed * `--static` and `--loop` options to interact with GIFs * `--protocol` option to choose a protocol * `--load` `--display` and `--clear` options to interact with Kitty protocol ## Installation ### From source (Recommended) Prerequisites - [Git](https://git-scm.com/downloads) - [Rust toolchain](https://www.rust-lang.org/tools/install) Command line instructions ```bash # Clone the repository git clone https://github.com/emsquid/pic # Build and install cargo install --path pic # Use freely pic Images/YourFavouriteImage.png --cols 13 ... ``` ### From Cargo Prerequisites - [Rust toolchain](https://www.rust-lang.org/tools/install) Command line instructions ```bash # Build and install cargo install pic # Use freely again pic Images/YourFavouriteImage.png --cols 13 ... ``` ### As a library Prerequisites - [Rust toolchain](https://www.rust-lang.org/tools/install) Command line instructions ```bash # Add the dependency in your project directory cargo add pic ``` ## Examples Blocks & Top quality previewing ![demo](examples/blocks.png) ![demo](examples/top_quality.png) Wide choice of options ![options](examples/options.gif) Really nice GIFs in iTerm ![iterm](examples/iterm.gif) And also nice in Blocks ![gotcha](examples/blocks.gif) ## Command line usage ``` Preview Image in CLI. Usage: pic [OPTIONS] [PATH]... Arguments: [PATH]... Image(s) to preview Options: -p, --protocol Previewing protocol to use [possible values: kitty, sixel, iterm, blocks] -x, --x x position (0 is left) -y, --y y position (0 is top) -c, --cols Number of cols to fit the preview in -r, --rows Number of rows to fit the preview in --spacing Spacing between images if more than one file is provided -u, --upscale Upscale image if needed -n, --no-newline Don't print newline after preview -s, --static Only show first frame of GIFs -l, --loop Loop GIFs infinitely --load Load image with the given id (kitty only) --display Display image with the given id (kitty only) --clear Clear image with the given id (0 for all) (kitty only) -h, --help Print help -V, --version Print version ``` ## Library usage ```rust use pic fn main() { // Choose images to preview let path1 = std::path::PathBuf::from("Picture/MyFavImage.png"); let mut options = pic::options::Options::new(vec![path1]); // Set your options options.set_position(Some(10), None); options.set_size(Some(50), Some(50)); options.upscale(); // Preview if let Err(err) = pic::previewer::preview(&mut std::io::stdout(), &mut options) { eprintln!("{err}"); }; } ``` ## Notes - `Sixel` protocol may require [libsixel](https://github.com/saitoha/libsixel) to be installed - `iTerm` protocol always loop GIFs, except if `--static` is specified ## Progress Help would be greatly appreciated - Documentation * [ ] Write a greater README * [ ] Make releases/packages (publish on crates.io) - Protocols support * [ ] Preview GIFs with Kitty protocol * [x] Preview GIFs with Unicode blocks * [ ] Work on handling transparency/GIFs with Sixel protocol (GIFs work but don't render well) * [ ] Improve protocol support checking (need to test in various terminal) - Miscellaneous * [ ] Implement caching somehow * [ ] Show cooler error messages * [ ] Write tests (I guess I need to do that...)