Braille Art to GIF Converter
Convert multi-frame Braille Unicode art into animated GIF files. Native GIF89a encoder with LZW compression, frame control, and live preview.
About
Braille Unicode characters (U+2800 - U+28FF) encode a 2ร4 dot matrix per glyph, yielding 256 possible patterns. Artists exploit this density to create high-resolution text-based images in terminals and chat platforms. Converting these static frames into animated GIFs requires decoding each character's dot pattern into a pixel grid, rendering sequential frames to a raster canvas, then encoding the result as a valid GIF89a binary with LZW compression. Getting the dot-to-bit mapping wrong produces garbled output. Getting the LZW table management wrong produces a corrupt file that no viewer can open. This tool handles both correctly: it parses the Braille codepoint offset from 0x2800, maps the 8-bit result to the standard dot positions, renders at configurable scale, and outputs a spec-compliant animated GIF with NETSCAPE2.0 looping extension.
Frame separation uses blank-line delimiters. Each frame must have consistent dimensions; the tool pads shorter rows automatically. Limitations: output uses a 2-color palette (foreground/background). Transparency is not supported. Maximum practical canvas size depends on browser memory, but typical Braille art of 80ร40 characters per frame at scale 4 produces a 640ร640 pixel GIF, which encodes in under a second.
Formulas
Each Braille character maps to a pixel grid via its Unicode codepoint offset:
The 8-bit offset maps to dot positions in a 2-column ร 4-row cell. The standard Braille dot numbering assigns bits as follows:
Bit 1 โ Dot 2 (row 1, col 0)
Bit 2 โ Dot 3 (row 2, col 0)
Bit 3 โ Dot 4 (row 0, col 1)
Bit 4 โ Dot 5 (row 1, col 1)
Bit 5 โ Dot 6 (row 2, col 1)
Bit 6 โ Dot 7 (row 3, col 0)
Bit 7 (MSB) โ Dot 8 (row 3, col 1)
For a frame with W characters wide and H lines tall, the output image dimensions in pixels are:
GIF frame delay is specified in hundredths of a second. For a target of fps frames per second:
The GIF89a LZW compression starts with a minimum code size of M bits (for a 2-color palette, M = 2). The clear code is 2M and EOI code is 2M + 1. Dictionary entries start at 2M + 2, with code width incrementing each time the dictionary size reaches 2currentBits.
Where W = frame width in characters, H = frame height in lines, scale = pixel multiplier per dot, fps = frames per second, M = minimum LZW code size.
Reference Data
| Braille Char | Unicode | Hex Offset | Binary (8-bit) | Dot Pattern | Dots Active |
|---|---|---|---|---|---|
| โ | U+2800 | 0x00 | 00000000 | Empty | None |
| โ | U+2801 | 0x01 | 00000001 | Top-left | 1 |
| โ | U+2802 | 0x02 | 00000010 | Mid-left | 2 |
| โ | U+2804 | 0x04 | 00000100 | Lower-left | 3 |
| โ | U+2808 | 0x08 | 00001000 | Top-right | 4 |
| โ | U+2810 | 0x10 | 00010000 | Mid-right | 5 |
| โ | U+2820 | 0x20 | 00100000 | Lower-right | 6 |
| โก | U+2840 | 0x40 | 01000000 | Bottom-left | 7 |
| โข | U+2880 | 0x80 | 10000000 | Bottom-right | 8 |
| โ | U+2803 | 0x03 | 00000011 | Top+Mid left | 1, 2 |
| โ | U+2809 | 0x09 | 00001001 | Top-left + Top-right | 1, 4 |
| โ | U+280F | 0x0F | 00001111 | Top 4 dots | 1, 2, 3, 4 |
| โฃฟ | U+28FF | 0xFF | 11111111 | All filled | 1, 2, 3, 4, 5, 6, 7, 8 |
| โฃ | U+28C0 | 0xC0 | 11000000 | Bottom row | 7, 8 |
| โ ฟ | U+283F | 0x3F | 00111111 | Top 6 dots | 1, 2, 3, 4, 5, 6 |
| โก | U+2847 | 0x47 | 01000111 | Left col + dot 7 | 1, 2, 3, 7 |
| โขถ | U+28B6 | 0xB6 | 10110110 | Mixed | 2, 3, 5, 6, 8 |
| โ | U+2815 | 0x15 | 00010101 | Diagonal | 1, 3, 5 |
| โกซ | U+286B | 0x6B | 01101011 | Checkerboard | 1, 2, 4, 6, 7 |
| โก | U+2844 | 0x44 | 01000100 | Lower-left + dot 7 | 3, 7 |