6 releases

Uses new Rust 2024

new 0.1.5 Oct 31, 2025
0.1.4 Oct 20, 2025
0.1.1 Sep 30, 2025

#65 in Visualization

Download history 264/week @ 2025-09-26 81/week @ 2025-10-03 15/week @ 2025-10-10 120/week @ 2025-10-17 18/week @ 2025-10-24

257 downloads per month

MIT and GPL-3.0-or-later

4MB
801 lines

ansimage

Example Image: Me Ascii

ansimage is a versatile Rust library and command-line tool for converting images into colorful terminal ANSI art.

It offers a high degree of control over character sets, color palettes, and output size, using perceptually uniform color calculations to generate high-quality results.

Crates.io Docs.rs

Features

  • Multiple Character Modes: Render images using standard ASCII brightness ramps, high-fidelity Unicode block characters, or your own custom character sets.
  • Advanced Color Handling: Supports 24-bit "truecolor" output as well as color quantization for terminals with limited palettes (e.g., 256 or 16 colors).
  • High-Quality Processing: Uses the L*u*v* color space for perceptually accurate color comparisons and imagequant for high-quality dithering and palette mapping.
  • Performance: Image processing is parallelized using Rayon to take advantage of multiple CPU cores.
  • Flexible Sizing: Easily fit the output to specific dimensions while preserving aspect ratio, or scale to an exact character width and height.
  • Simple CLI and Library API: Use it as a quick command-line tool or integrate it directly into your Rust projects.

Installation

As a Command-Line Tool

Ensure you have the Rust toolchain installed. You can then install ansimage directly from Crates.io:

cargo install --locked ansimage

As a Library

Add ansimage as a dependency in your Cargo.toml file:

[dependencies]
ansimage = "0.1.0" # Replace with the latest version

Usage

Command-Line Interface

The CLI provides a straightforward way to convert an image. The only required argument is the input file path.

Basic Conversion

This command will process photo.jpg and print the resulting ANSI art to your terminal.

ansimage photo.jpg

Saving to a File

Use the --output or -o flag to save the result to a text file. You can combine this with --quiet to suppress terminal output.

ansimage photo.jpg --output art.txt --quiet

For a full list of commands, run:

ansimage --help

Library API

Integrating ansimage into your own project is simple. The main entry point is the convert function, which takes an image path and a Settings struct.

Here's a basic example:

use ansimage::{convert, error::Result, Settings};
use std::path::Path;

fn main() -> Result<()> {
    // Use default settings for a quick conversion.
    let settings = Settings::default();

    // The path to the image you want to convert.
    let image_path = Path::new("path/to/my_image.png");

    // Call the convert function.
    let terminal_art = convert(image_path, &settings)?;

    // Print the result!
    println!("{}", terminal_art);

    Ok(())
}

Configuration

You can customize the output by modifying the Settings struct.

  • size: Control the output width, height, and SizeMode (Fit vs. Exact).
  • characters: Choose a CharacterMode (Ascii, Unicode, Custom), ColorMode (OneColor vs. TwoColor), and adjust the font's aspect_ratio.
  • colors: Enable or disable is_truecolor mode. When false, you must provide a palette of image::Rgb<u8> colors.
  • advanced: Configure the resize_filter and enable/disable dithering.

Example: Custom Unicode Settings

use ansimage::{
    palettes, settings::{CharacterMode, UnicodeCharSet},
    Characters, Colors, Settings, Size,
};

let custom_settings = Settings {
    size: Size {
        width: 100,
        ..Default::default()
    },
    characters: Characters {
        // Use high-resolution quarter-block Unicode characters.
        mode: CharacterMode::Unicode(UnicodeCharSet::Quarter),
        ..Default::default()
    },
    colors: Colors {
        // Disable truecolor and use a predefined 16-color palette.
        is_truecolor: false,
        palette: palettes::COLOR_PALETTE_SWEETIE16.to_vec(),
    },
    ..Default::default()
};

// Use this custom_settings object with the `convert` function.

Examples

me

Example Image: Me

me ascii

Example Image: Me Ascii

me fullblock

Example Image: Me Fullblock

me quarterblock

Example Image: Me Quarterblock

me quarterblock sweetie16

Example Image: Me Quarterblock Sweetie16

me quarterblock horrorbluedark

Example Image: Me Quarterblock Horrorbluedark

redpanda

Example Image: Redpanda

redpanda ascii

Example Image: Redpanda Ascii

redpanda quarterblock

Example Image: Redpanda Quarterblock

redpanda quarterblock sweetie16

Example Image: Redpanda Quarterblock Sweetie16

redpanda quarterblock horrorbluedark

Example Image: Redpanda Quarterblock Horrorbluedark

popsicle

Example Image: Popsicle

popsicle ascii

Example Image: Popsicle Ascii

popsicle quarterblock

Example Image: Popsicle Quarterblock

popsicle quarterblock sweetie16

Example Image: Popsicle Quarterblock Sweetie16

popsicle quarterblock horrorbluedark

Example Image: Popsicle Quarterblock Horrorbluedark

blackhole

Example Image: Blackhole

blackhole ascii

Example Image: Blackhole Ascii

blackhole quarterblock

Example Image: Blackhole Quarterblock

blackhole quarterblock sweetie16

Example Image: Blackhole Quarterblock Sweetie16

blackhole quarterblock horrorbluedark

Example Image: Blackhole Quarterblock Horrorbluedark

Todo

  • Option for color text on constant background (opposite of current)
  • Allow basic image manipulation in bin, e.g. contrast, saturation, brightness
  • Manually override fg text

License

This project is licensed under the MIT License. See the LICENSE file for details.

Dependencies

~17MB
~336K SLoC