Created
August 10, 2018 02:45
-
-
Save JonnoFTW/fe8b63600eea529dd02e9552332bccf1 to your computer and use it in GitHub Desktop.
Convert images to terminal colours
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
# -*- coding: utf-8 -*- | |
from PIL import Image | |
mem = {} | |
cols = {0:(0, 0, 0),1:(128, 0, 0),2:(0, 128, 0),3:(128, 128, 0),4:(0, 0, 128),5:(128, 0, 128),6:(0, 128, 128),7:(192, 192, 192),8:(128, 128, 128), | |
9:(255, 0, 0),10:(0, 255, 0),11:(255, 255, 0),12:(0, 0, 255),13:(255, 0, 255),14:(0, 255, 255),15:(255, 255, 255),216:(0, 0, 0, 0),16:(0, 0, 0), | |
17:(0, 0, 95),18:(0, 0, 135),19:(0, 0, 175),20:(0, 0, 215),21:(0, 0, 255),22:(0, 95, 0),23:(0, 95, 95),24:(0, 95, 135),25:(0, 95, 175),26:(0, 95, 215), | |
27:(0, 95, 255),28:(0, 135, 0),29:(0, 135, 95),30:(0, 135, 135),31:(0, 135, 175),32:(0, 135, 215),33:(0, 135, 255),34:(0, 175, 0),35:(0, 175, 95), | |
36:(0, 175, 135),37:(0, 175, 175),38:(0, 175, 215),39:(0, 175, 255),40:(0, 215, 0),41:(0, 215, 95),42:(0, 215, 135),43:(0, 215, 175),44:(0, 215, 215), | |
45:(0, 215, 255),46:(0, 255, 0),47:(0, 255, 95),48:(0, 255, 135),49:(0, 255, 175),50:(0, 255, 215),51:(0, 255, 255),52:(95, 0, 0),53:(95, 0, 95), | |
54:(95, 0, 135),55:(95, 0, 175),56:(95, 0, 215),57:(95, 0, 255),58:(95, 95, 0),59:(95, 95, 95),60:(95, 95, 135),61:(95, 95, 175),62:(95, 95, 215), | |
63:(95, 95, 255),64:(95, 135, 0),65:(95, 135, 95),66:(95, 135, 135),67:(95, 135, 175),68:(95, 135, 215),69:(95, 135, 255),70:(95, 175, 0), | |
71:(95, 175, 95),72:(95, 175, 135),73:(95, 175, 175),74:(95, 175, 215),75:(95, 175, 255),76:(95, 215, 0),77:(95, 215, 95),78:(95, 215, 135), | |
79:(95, 215, 175),80:(95, 215, 215),81:(95, 215, 255),82:(95, 255, 0),83:(95, 255, 95),84:(95, 255, 135),85:(95, 255, 175),86:(95, 255, 215), | |
87:(95, 255, 255),88:(135, 0, 0),89:(135, 0, 95),90:(135, 0, 135),91:(135, 0, 175),92:(135, 0, 215),93:(135, 0, 255),94:(135, 95, 0),95:(135, 95, 95), | |
96:(135, 95, 135),97:(135, 95, 175),98:(135, 95, 215),99:(135, 95, 255),100:(135, 135, 0),101:(135, 135, 95),102:(135, 135, 135),103:(135, 135, 175), | |
104:(135, 135, 215),105:(135, 135, 255),106:(135, 175, 0),107:(135, 175, 95),108:(135, 175, 135),109:(135, 175, 175),110:(135, 175, 215),111:(135, 175, 255), | |
112:(135, 215, 0),113:(135, 215, 95),114:(135, 215, 135),115:(135, 215, 175),116:(135, 215, 215),117:(135, 215, 255),118:(135, 255, 0),119:(135, 255, 95), | |
120:(135, 255, 135),121:(135, 255, 175),122:(135, 255, 215),123:(135, 255, 255),124:(175, 0, 0),125:(175, 0, 95),126:(175, 0, 135),127:(175, 0, 175), | |
128:(175, 0, 215),129:(175, 0, 255),130:(175, 95, 0),131:(175, 95, 95),132:(175, 95, 135),133:(175, 95, 175),134:(175, 95, 215),135:(175, 95, 255), | |
136:(175, 135, 0),137:(175, 135, 95),138:(175, 135, 135),139:(175, 135, 175),140:(175, 135, 215),141:(175, 135, 255),142:(175, 175, 0),143:(175, 175, 95), | |
144:(175, 175, 135),145:(175, 175, 175),146:(175, 175, 215),147:(175, 175, 255),148:(175, 215, 0),149:(175, 215, 95),150:(175, 215, 135),151:(175, 215, 175), | |
152:(175, 215, 215),153:(175, 215, 255),154:(175, 255, 0),155:(175, 255, 95),156:(175, 255, 135),157:(175, 255, 175),158:(175, 255, 215),159:(175, 255, 255), | |
160:(215, 0, 0),161:(215, 0, 95),162:(215, 0, 135),163:(215, 0, 175),164:(215, 0, 215),165:(215, 0, 255),166:(215, 95, 0),167:(215, 95, 95), | |
168:(215, 95, 135),169:(215, 95, 175),170:(215, 95, 215),171:(215, 95, 255),172:(215, 135, 0),173:(215, 135, 95),174:(215, 135, 135), | |
175:(215, 135, 175),176:(215, 135, 215),177:(215, 135, 255),178:(215, 175, 0),179:(215, 175, 95),180:(215, 175, 135),181:(215, 175, 175), | |
182:(215, 175, 215),183:(215, 175, 255),184:(215, 215, 0),185:(215, 215, 95),186:(215, 215, 135),187:(215, 215, 175),188:(215, 215, 215), | |
189:(215, 215, 255),190:(215, 255, 0),191:(215, 255, 95),192:(215, 255, 135),193:(215, 255, 175),194:(215, 255, 215),195:(215, 255, 255), | |
196:(255, 0, 0),197:(255, 0, 95),198:(255, 0, 135),199:(255, 0, 175),200:(255, 0, 215),201:(255, 0, 255),202:(255, 95, 0),203:(255, 95, 95), | |
204:(255, 95, 135),205:(255, 95, 175),206:(255, 95, 215),207:(255, 95, 255),208:(255, 135, 0),209:(255, 135, 95),210:(255, 135, 135),211:(255, 135, 175), | |
212:(255, 135, 215),213:(255, 135, 255),214:(255, 175, 0),215:(255, 175, 95),216:(255, 175, 135),217:(255, 175, 175),218:(255, 175, 215),219:(255, 175, 255), | |
220:(255, 215, 0),221:(255, 215, 95),222:(255, 215, 135),223:(255, 215, 175),224:(255, 215, 215),225:(255, 215, 255),226:(255, 255, 0),227:(255, 255, 95), | |
228:(255, 255, 135),229:(255, 255, 175),230:(255, 255, 215),231:(255, 255, 255),232:(8, 8, 8),233:(18, 18, 18),234:(28, 28, 28),235:(38, 38, 38), | |
236:(48, 48, 48),237:(58, 58, 58),238:(68, 68, 68),239:(78, 78, 78),240:(88, 88, 88),241:(98, 98, 98),242:(108, 108, 108),243:(118, 118, 118), | |
244:(128, 128, 128),245:(138, 138, 138),246:(148, 148, 148),247:(158, 158, 158),248:(168, 168, 168),249:(178, 178, 178),250:(188, 188, 188), | |
251:(198, 198, 198),252:(208, 208, 208),253:(218, 218, 218),254:(228, 228, 228),255:(238, 238, 238),} | |
def closest_col(pxl): | |
if pxl in mem: | |
return mem[pxl] | |
out = min(cols.items(), key=lambda x: col_dist(x[1], pxl))[0] | |
mem[pxl] = out | |
return out | |
def col_dist(a,b): | |
r = (a[0] + b[0]) /2 | |
dr = (a[0] - b[0])**2 | |
dg = (a[1] - b[1])**2 | |
db = (a[2] - b[2])**2 | |
return (2*dr + 4*dg + 3* db + ((r*(dr-db))/256))**0.5 | |
def img(fname): | |
input_img = Image.open(fname) | |
x_acc = 64 | |
input_img = input_img.resize((x_acc, x_acc), Image.ANTIALIAS) | |
output = '' | |
width, height = input_img.size | |
for y in range(height/2): | |
y2 = 2*y | |
for x in range(width): | |
top_pxl = input_img.getpixel((x,y2)) | |
bot_pxl = input_img.getpixel((x,y2+1)) | |
# get the closest ansi colour to this pixel | |
top_col = closest_col(top_pxl) | |
bot_col = closest_col(bot_pxl) | |
output += u"\x1B[38;5;{};48;5;{}m▀\x1B[0m".format(top_col, bot_col) # ▀ \u2588 | |
output += "\n" | |
print(output) | |
if __name__ == "__main__": | |
import sys | |
img(sys.argv[1]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment