cascii - Interactive ASCII Frame Generator
cascii is a high-performance, interactive tool for converting videos and image sequences into ASCII art frames.
New: cascii can now be used as both a CLI tool and a Rust library!
When converting a video, the output files will be placed in a directory named after the video file. For example, cascii my_video.mp4 will create a my_video directory.
I recommend installing cascii-viewer to easily play any ascii animation generated
Features
- Interactive Mode: If you don't provide arguments,
casciiwill prompt you for them. - Flexible Input: Works with video files or directories of PNGs.
- Performance: Uses
ffmpegfor fast frame extraction and parallel processing with Rayon for ASCII conversion. - Video Segments: Specify start and end times to convert only a portion of a video.
- Presets:
--smalland--largeflags for quick quality adjustments. - Non-interactive Mode: Use
--defaultto run without prompts, using default values. - Library Support: Use cascii as a dependency in your own Rust projects.
Installation
As a CLI Tool
An install.sh script is provided to build and install cascii to /usr/local/bin.
# Make sure you are in the cascii directory
You will be prompted for your password as it uses sudo to copy the binary.
Alternatively, install from crates.io (once published):
As a Library
Add to your Cargo.toml:
[]
= "0.1"
CLI Usage
CLI Usage
cascii
Interactive
Run cascii without any arguments to be guided through the process:
It will first ask you to select an input file from the current directory, then prompt for the output directory, and finally for the quality settings.
With Arguments
You can also provide arguments directly:
# Basic usage with a video file
# Using presets
# Non-interactive mode (will fail if input is not provided)
# Convert a 5-second clip starting at 10 seconds into the video
Options
[input]: (Optional) The input video file or directory of images.-o,--out: (Optional) The output directory. Defaults to the current directory.--columns: (Optional) The width of the output ASCII art.--fps: (Optional) The frames per second to extract from a video.--font-ratio: (Optional) The aspect ratio of the font used for rendering.--start: (Optional) The start time for video conversion (e.g.,00:01:23.456or83.456).--end: (Optional) The end time for video conversion.--default: Skips all prompts and uses default values for any missing arguments.-s,--small: Uses smaller default values for quality settings.-l,--large: Uses larger default values for quality settings.-h,--help: Shows the help message.-V,--version: Shows the version information.
Examples:
Source image:

Test 1:
settings:
Luminance: 1
Font Ratio: 0.7
Columns: 400

Test 2:
settings:
Luminance: 35
Font Ratio: 0.7
Columns: 400

Test 3:
settings:
Luminance: 35
Font Ratio: 0.5
Columns: 400

Test 4:
settings:
Luminance: 35
Font Ratio: 1
Columns: 400

Test animation 1:
Reconstituting a few seconds from the clip Aleph 2 by Max Cooper (around 2:30 to 3:00)
Frames: 960
Luminance: 30
Font Ratio: 0.7
Columns: 400
FPS: 30

Library Usage
cascii can be used as a Rust library in your own projects.
Basic Example - Convert an Image to ASCII
use ;
use Path;
Convert Image to String (No File)
use ;
use Path;
Convert a Video to ASCII Frames
use ;
use Path;
Using Presets
use AsciiConverter;
use Path;
API Reference
AsciiConverter
Main converter struct for ASCII art generation.
Methods:
new()- Create converter with default configurationwith_config(config: AppConfig)- Create with custom configurationfrom_config_file(path: &Path)- Load configuration from fileconvert_image(input, output, options)- Convert image to ASCII fileimage_to_string(input, options)- Convert image to ASCII stringconvert_video(input, output_dir, video_opts, conv_opts, keep_images)- Convert video to ASCII framesconvert_directory(input_dir, output_dir, options, keep_images)- Convert directory of imagesget_preset(name)- Get a preset by nameoptions_from_preset(name)- Get conversion options from a preset
ConversionOptions
Options for ASCII conversion.
Fields:
columns: Option<u32>- Target width in charactersfont_ratio: f32- Font aspect ratio (width/height)luminance: u8- Luminance threshold (0-255)ascii_chars: String- ASCII character set (darkest to lightest)
Methods:
default()- Create with default optionswith_columns(columns)- Set target widthwith_font_ratio(ratio)- Set font ratiowith_luminance(threshold)- Set luminance thresholdwith_ascii_chars(chars)- Set custom character set
VideoOptions
Options for video conversion.
Fields:
fps: u32- Frames per second to extractstart: Option<String>- Start time (e.g., "00:01:23" or "83")end: Option<String>- End timecolumns: u32- Target width in characters
Examples
See the examples/ directory for complete examples:
simple_image.rs- Basic image conversionsimple_video.rs- Video conversion
Run examples with:
Sample commands
Test Image
./target/release/ascii-gen
--input ./some_frames_dir
--out ../output/sunset_hl
--font-ratio 0.7
Test Video
./target/release/ascii-gen
--input ../input.webm
--out ../output/sunset_hl
--columns 800
--fps 30
--font-ratio 0.7
Acknowledgements
This project is inspired by developedbyed's video that I recommend watching, I reused the logic from his bash script and rewrote it in rust so that it could process faster files with more details.