Skip to content

Instantly share code, notes, and snippets.

@puhitaku
Forked from klange/image-to-ansi.py
Last active January 19, 2019 21:46
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save puhitaku/7eaf6142fa5a42425f55 to your computer and use it in GitHub Desktop.
Save puhitaku/7eaf6142fa5a42425f55 to your computer and use it in GitHub Desktop.
Convert images to ANSI escape sequences
#! /usr/bin/env python
"""This is an improved image_to_ansi.py.
It's 7x faster than original version.
WTFPL is preserved for saying thank you to original developer, Mr. Elliott.
"""
__author__ = 'Micah Elliott http://MicahElliott.com; Kevin Lange <k@dakko.us>; Takumi Sueda <puhitaku@gmail.com>'
__version__ = '0.1'
__copyright__ = 'Copyright (C) 2011 Micah Elliott. All rights reserved.'
__license__ = 'WTFPL http://sam.zoy.org/wtfpl/'
import sys
CLUT = [
('000000', '00'),
('800000', '01'),
('008000', '02'),
('808000', '03'),
('000080', '04'),
('800080', '05'),
('008080', '06'),
('c0c0c0', '07'),
('808080', '08'),
('ff0000', '09'),
('00ff00', '10'),
('ffff00', '11'),
('0000ff', '12'),
('ff00ff', '13'),
('00ffff', '14'),
('ffffff', '15'),
('000000', '16'),
('00005f', '17'),
('000087', '18'),
('0000af', '19'),
('0000d7', '20'),
('0000ff', '21'),
('005f00', '22'),
('005f5f', '23'),
('005f87', '24'),
('005faf', '25'),
('005fd7', '26'),
('005fff', '27'),
('008700', '28'),
('00875f', '29'),
('008787', '30'),
('0087af', '31'),
('0087d7', '32'),
('0087ff', '33'),
('00af00', '34'),
('00af5f', '35'),
('00af87', '36'),
('00afaf', '37'),
('00afd7', '38'),
('00afff', '39'),
('00d700', '40'),
('00d75f', '41'),
('00d787', '42'),
('00d7af', '43'),
('00d7d7', '44'),
('00d7ff', '45'),
('00ff00', '46'),
('00ff5f', '47'),
('00ff87', '48'),
('00ffaf', '49'),
('00ffd7', '50'),
('00ffff', '51'),
('5f0000', '52'),
('5f005f', '53'),
('5f0087', '54'),
('5f00af', '55'),
('5f00d7', '56'),
('5f00ff', '57'),
('5f5f00', '58'),
('5f5f5f', '59'),
('5f5f87', '60'),
('5f5faf', '61'),
('5f5fd7', '62'),
('5f5fff', '63'),
('5f8700', '64'),
('5f875f', '65'),
('5f8787', '66'),
('5f87af', '67'),
('5f87d7', '68'),
('5f87ff', '69'),
('5faf00', '70'),
('5faf5f', '71'),
('5faf87', '72'),
('5fafaf', '73'),
('5fafd7', '74'),
('5fafff', '75'),
('5fd700', '76'),
('5fd75f', '77'),
('5fd787', '78'),
('5fd7af', '79'),
('5fd7d7', '80'),
('5fd7ff', '81'),
('5fff00', '82'),
('5fff5f', '83'),
('5fff87', '84'),
('5fffaf', '85'),
('5fffd7', '86'),
('5fffff', '87'),
('870000', '88'),
('87005f', '89'),
('870087', '90'),
('8700af', '91'),
('8700d7', '92'),
('8700ff', '93'),
('875f00', '94'),
('875f5f', '95'),
('875f87', '96'),
('875faf', '97'),
('875fd7', '98'),
('875fff', '99'),
('878700', '100'),
('87875f', '101'),
('878787', '102'),
('8787af', '103'),
('8787d7', '104'),
('8787ff', '105'),
('87af00', '106'),
('87af5f', '107'),
('87af87', '108'),
('87afaf', '109'),
('87afd7', '110'),
('87afff', '111'),
('87d700', '112'),
('87d75f', '113'),
('87d787', '114'),
('87d7af', '115'),
('87d7d7', '116'),
('87d7ff', '117'),
('87ff00', '118'),
('87ff5f', '119'),
('87ff87', '120'),
('87ffaf', '121'),
('87ffd7', '122'),
('87ffff', '123'),
('af0000', '124'),
('af005f', '125'),
('af0087', '126'),
('af00af', '127'),
('af00d7', '128'),
('af00ff', '129'),
('af5f00', '130'),
('af5f5f', '131'),
('af5f87', '132'),
('af5faf', '133'),
('af5fd7', '134'),
('af5fff', '135'),
('af8700', '136'),
('af875f', '137'),
('af8787', '138'),
('af87af', '139'),
('af87d7', '140'),
('af87ff', '141'),
('afaf00', '142'),
('afaf5f', '143'),
('afaf87', '144'),
('afafaf', '145'),
('afafd7', '146'),
('afafff', '147'),
('afd700', '148'),
('afd75f', '149'),
('afd787', '150'),
('afd7af', '151'),
('afd7d7', '152'),
('afd7ff', '153'),
('afff00', '154'),
('afff5f', '155'),
('afff87', '156'),
('afffaf', '157'),
('afffd7', '158'),
('afffff', '159'),
('d70000', '160'),
('d7005f', '161'),
('d70087', '162'),
('d700af', '163'),
('d700d7', '164'),
('d700ff', '165'),
('d75f00', '166'),
('d75f5f', '167'),
('d75f87', '168'),
('d75faf', '169'),
('d75fd7', '170'),
('d75fff', '171'),
('d78700', '172'),
('d7875f', '173'),
('d78787', '174'),
('d787af', '175'),
('d787d7', '176'),
('d787ff', '177'),
('d7af00', '178'),
('d7af5f', '179'),
('d7af87', '180'),
('d7afaf', '181'),
('d7afd7', '182'),
('d7afff', '183'),
('d7d700', '184'),
('d7d75f', '185'),
('d7d787', '186'),
('d7d7af', '187'),
('d7d7d7', '188'),
('d7d7ff', '189'),
('d7ff00', '190'),
('d7ff5f', '191'),
('d7ff87', '192'),
('d7ffaf', '193'),
('d7ffd7', '194'),
('d7ffff', '195'),
('ff0000', '196'),
('ff005f', '197'),
('ff0087', '198'),
('ff00af', '199'),
('ff00d7', '200'),
('ff00ff', '201'),
('ff5f00', '202'),
('ff5f5f', '203'),
('ff5f87', '204'),
('ff5faf', '205'),
('ff5fd7', '206'),
('ff5fff', '207'),
('ff8700', '208'),
('ff875f', '209'),
('ff8787', '210'),
('ff87af', '211'),
('ff87d7', '212'),
('ff87ff', '213'),
('ffaf00', '214'),
('ffaf5f', '215'),
('ffaf87', '216'),
('ffafaf', '217'),
('ffafd7', '218'),
('ffafff', '219'),
('ffd700', '220'),
('ffd75f', '221'),
('ffd787', '222'),
('ffd7af', '223'),
('ffd7d7', '224'),
('ffd7ff', '225'),
('ffff00', '226'),
('ffff5f', '227'),
('ffff87', '228'),
('ffffaf', '229'),
('ffffd7', '230'),
('ffffff', '231'),
('080808', '232'),
('121212', '233'),
('1c1c1c', '234'),
('262626', '235'),
('303030', '236'),
('3a3a3a', '237'),
('444444', '238'),
('4e4e4e', '239'),
('585858', '240'),
('626262', '241'),
('6c6c6c', '242'),
('767676', '243'),
('808080', '244'),
('8a8a8a', '245'),
('949494', '246'),
('9e9e9e', '247'),
('a8a8a8', '248'),
('b2b2b2', '249'),
('bcbcbc', '250'),
('c6c6c6', '251'),
('d0d0d0', '252'),
('dadada', '253'),
('e4e4e4', '254'),
('eeeeee', '255'),
]
def _create_incs_lut():
incs = [(0x00, 0x5f), (0x5f, 0x87), (0x87, 0xaf), (0xaf, 0xd7), (0xd7, 0xff)]
res = []
for part in range(256):
for s, b in incs:
if s <= part <= b:
if abs(s - part) < abs(b - part):
res.append('%02x' % s)
else:
res.append('%02x' % b)
break
return res
RGB2SHORT_DICT = dict(CLUT)
INCS_LUT = _create_incs_lut()
def lut(part):
return INCS_LUT[part]
def rgb2short_fast(r, g, b):
return RGB2SHORT_DICT['%s%s%s' % (lut(r), lut(g), lut(b))]
if __name__ == '__main__':
from PIL import Image
im = Image.open('scr.png')
x = im.size[0]
im = list(im.getdata())
s = []
for i, p in enumerate(im):
short = rgb2short_fast(p[0], p[1], p[2])
s.append("\033[48;5;%sm " % short)
if (i+1) % x == 0:
s.append("\033[0m\n")
s.append("\n")
sys.stdout.write(''.join(s))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment