Sixel Graphics
Reading time: 1 minutes and 7 seconds.
What are Sixels?
VT330/VT340 Programmer Reference Manual, Ch. 14 Sixel Graphics.
Escape Character
DCS (Device Control String): 0x90
OR
ESC+P: 0x1B
+ 0x50
Termination
ST (String Terminator) 0x0
OR
ESC+\: 0x1B
+ 0x5C
Control Functions
LSB (least-significant bit) at the top.
>>> 0x90 0x40 = 0x90 0b000001
■
□
□
□
□
□
>>> 0x90 0x74 = 0x90 0b110100
■
□
■
□
■
■
>>> sixel2str = lambda i : '\n'.join(['■' if (((i-0x3F) >> j) & 1) else '□' for j in range(6)])
>>> sixels2str = lambda il : '\n'.join([' '.join(l) for l in zip(*[[c for c in sixel2str(i) if c != '\n'] for i in il])])
>>> print(sixel2str(0x74))
■
□
■
□
■
■
# Brian Kernighan's algo.
def count_bits(n):
count = 0
while n:
n &= (n-1)
count += 1
return count
countbits = lambda n : (count := 0, (while n: (n &= (n-1)), count += 1), count)[-1]
for i, c in enumerate(range(ord('?'), ord('?')+64)):
print(f"|`{bin(i).replace('0b','').rjust(6, '0')}`|`{chr(c)}`|`{hex(c).upper().replace('X','x')}`|")
Sixel | Char | Hex |
---|---|---|
000000 | ? | 0x3F |
000001 | @ | 0x40 |
000010 | A | 0x41 |
000011 | B | 0x42 |
000100 | C | 0x43 |
000101 | D | 0x44 |
000110 | E | 0x45 |
000111 | F | 0x46 |
001000 | G | 0x47 |
001001 | H | 0x48 |
001010 | I | 0x49 |
001011 | J | 0x4A |
001100 | K | 0x4B |
001101 | L | 0x4C |
001110 | M | 0x4D |
001111 | N | 0x4E |
010000 | O | 0x4F |
010001 | P | 0x50 |
010010 | Q | 0x51 |
010011 | R | 0x52 |
010100 | S | 0x53 |
010101 | T | 0x54 |
010110 | U | 0x55 |
010111 | V | 0x56 |
011000 | W | 0x57 |
011001 | X | 0x58 |
011010 | Y | 0x59 |
011011 | Z | 0x5A |
011100 | [ | 0x5B |
011101 | \ |0x5C | | |
011110 | ] | 0x5D |
011111 | ^ | 0x5E |
100000 | _ | 0x5F |
100001 | ` | 0x60 |
100010 | a | 0x61 |
100011 | b | 0x62 |
100100 | c | 0x63 |
100101 | d | 0x64 |
100110 | e | 0x65 |
100111 | f | 0x66 |
101000 | g | 0x67 |
101001 | h | 0x68 |
101010 | i | 0x69 |
101011 | j | 0x6A |
101100 | k | 0x6B |
101101 | l | 0x6C |
101110 | m | 0x6D |
101111 | n | 0x6E |
110000 | o | 0x6F |
110001 | p | 0x70 |
110010 | q | 0x71 |
110011 | r | 0x72 |
110100 | s | 0x73 |
110101 | t | 0x74 |
110110 | u | 0x75 |
110111 | v | 0x76 |
111000 | w | 0x77 |
111001 | x | 0x78 |
111010 | y | 0x79 |
111011 | z | 0x7A |
111100 | { | 0x7B |
111101 | \| | 0x7C |
111110 | } | 0x7D |
111111 | ~ | 0x7E |