User Rating 0.0 ā˜…ā˜…ā˜…ā˜…ā˜…
Total Usage 0 times
0, 0
1 / 1
Is this tool helpful?

Your feedback helps us improve.

ā˜… ā˜… ā˜… ā˜… ā˜…

About

Frame-by-frame ASCII animation demands spatial reasoning across a discrete character grid. Each cell holds exactly one glyph from a set of 95 printable ASCII characters (code points 32 - 126). Timing errors compound: a single misplaced frame at f = 12 fps produces an 83 ms visual glitch that breaks perceived motion. This tool implements a full editing pipeline with onion skinning, flood fill via breadth-first search, and native GIF89a encoding with LZW compression for export. Grid dimensions are configurable up to 80 Ɨ 40 characters.

The tool approximates smooth motion through persistence of vision at configurable rates between 1 and 24 fps. Onion skinning renders the previous frame at reduced opacity so you can track motion deltas between frames. All project data persists in localStorage. Limitation: GIF export rasterizes glyphs onto a canvas, so output resolution depends on chosen font size. For terminal playback, use the plain-text export with frame delimiters.

ascii art animation creator text animation ascii generator frame animation gif export pixel art

Formulas

Playback timing derives from the frame rate. The interval between frames:

tinterval = 1000f ms

where f is the frame rate in fps. At f = 12 fps, each frame displays for 83.3 ms.

The flood fill algorithm uses BFS. Starting from cell (r, c) with target character t and replacement character rchar:

BFS(r, c): enqueue (r, c) → while queue ≠ āˆ…: dequeue (i, j) → if grid[i][j] = t: set rchar, enqueue 4-neighbors

GIF89a encoding uses LZW compression. The minimum code size m is derived from the color table size N:

m = max(2, ⌈log2(N)āŒ‰)

where N is the number of distinct colors in the palette (here 4: background, foreground, onion skin, transparent). Variable-length codes start at m + 1 bits and grow as the dictionary fills.

Reference Data

CharacterCode PointCommon Animation UseVisual Weight
.46Empty space / background dotLight
#35Solid block / wallHeavy
@64Character / entity centerHeavy
*42Sparkle / explosion particleMedium
-45Horizontal line / groundLight
|124Vertical line / wall edgeMedium
/47Diagonal line (left-leaning)Medium
\92Diagonal line (right-leaning)Medium
_95Floor / underlineLight
=61Double horizontal / trackMedium
~126Water / wave motionLight
^94Arrow up / mountain peakLight
O79Circle / head / ballHeavy
o111Small circle / bubbleMedium
:58Eyes / sparse patternLight
;59Wink / dripLight
( )40, 41Curved body / shieldMedium
< >60, 62Arrows / mouth / beakMedium
+43Crosshair / intersectionMedium
&38Dense fill / vegetationHeavy
%37Texture / debrisHeavy
!33Exclamation / rain dropMedium
'39Spark / apostropheLight
"34Double spark / steamLight
(space)32True empty / transparencyNone

Frequently Asked Questions

Onion skinning renders the previous frame's content at reduced opacity (typically 30%) behind the current frame on the canvas. This lets you see the character positions from frame Nāˆ’1 while editing frame N, allowing you to track motion deltas and maintain consistent movement speed. Without it, aligning a moving character across frames requires constant frame-switching, which slows production significantly.
The BFS-based flood fill targets only cells matching the exact character at the clicked position. If you click a cell containing a period (.), only contiguous cells also containing periods are replaced. Diagonal cells are not considered neighbors - only 4-directional adjacency (up, down, left, right) is used. This prevents fill from leaking through diagonal gaps, which is the standard behavior in grid-based editors.
The GIF export rasterizes each frame onto an HTML Canvas using a monospace font. Output resolution equals columns Ɨ character width by rows Ɨ character height in pixels. The encoder supports up to 256 colors per frame (GIF89a spec), but this tool uses only 2-4 colors (background and foreground), so palette overhead is minimal. LZW compression is implemented natively in JavaScript, so encoding a 100-frame animation at 80Ɨ40 characters may take 2-5 seconds depending on device performance.
The tool supports up to 80 columns Ɨ 40 rows (3,200 cells per frame). Canvas rendering at this size remains smooth on modern devices. At 120Ɨ60 (7,200 cells), you may notice slight input lag on mobile devices. The bottleneck is not rendering but event handling - each mouse/touch move triggers a cell lookup calculation. For terminal-standard animations, 80Ɨ24 matches the classic VT100 terminal dimensions.
Each frame is exported as a block of text with exact row/column structure. Frames are separated by a configurable delimiter line (default: ---FRAME---). To play back in a Unix terminal, you can use a simple bash loop: clear the screen, cat each frame block, then sleep for 1/fps seconds. The export preserves trailing spaces so column alignment is maintained. No ANSI escape codes are included - it is pure ASCII.
Yes. The import function accepts plain text. Each line becomes a row. Lines shorter than the grid width are right-padded with spaces. Lines longer are truncated. If the text has more lines than the grid height, excess lines are discarded. This lets you paste ASCII art from any source and use it as a base frame for animation.