diff options
-rwxr-xr-x | pixelterm.py | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/pixelterm.py b/pixelterm.py new file mode 100755 index 0000000..bbf15c6 --- /dev/null +++ b/pixelterm.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python + +import os, sys, argparse +from pygments.formatters import terminal256 +from PIL import Image, PngImagePlugin + +def termify_pixels(img): + sx, sy = img.size + out = '' + formatter = terminal256.Terminal256Formatter() + def bgescape(color): + r,g,b,a = color + if color == (0,0,0,0): + return terminal256.EscapeSequence(bg=formatter._closest_color(0,0,0)).reset_string() + return terminal256.EscapeSequence(bg=formatter._closest_color(r,g,b)).color_string() + def fgescape(color): + r,g,b,_ = color + return terminal256.EscapeSequence(fg=formatter._closest_color(r,g,b)).color_string() + #NOTE: This ignores the last line if there is an odd number of lines. + for y in range(0, sy-1, 2): + lastfg, lastbg = None, None + for x in range(sx): + coltop = img.getpixel((x, y)) + colbot = img.getpixel((x, y+1)) + if coltop[3] != 255: + coltop = (0,0,0,0) + if colbot[3] != 255: + colbot = (0,0,0,0) + if coltop == colbot: + if lastfg == coltop: + out += '█' + elif lastbg == coltop: + out += ' ' + else: + out += bgescape(coltop) + lastfg = coltop + out += ' ' + else: + if coltop == (0,0,0,0): + if lastfg != colbot: + out += fgescape(colbot) + lastfg = colbot + if lastbg != coltop: + out += bgescape(coltop) + lastbg = coltop + out += '▄' + elif colbot == (0,0,0,0): + if lastfg != coltop: + out += fgescape(coltop) + lastfg = coltop + if lastbg != colbot: + out += bgescape(colbot) + lastbg = colbot + out += '▀' + elif lastbg == coltop: + if lastfg != colbot: + out += fgescape(colbot) + lastfg = colbot + out += '▄' + elif lastbg == colbot: + if lastfg != coltop: + out += fgescape(coltop) + lastfg = coltop + out += '▀' + else: + if lastfg == coltop: + out += bgescape(coltop) + lastbg = coltop + out += '▀' + elif lastfg == colbot: + out += bgescape(colbot) + lastbg = colbot + out += '▄' + else: + out += fgescape(coltop) + lastfg = coltop + out += bgescape(colbot) + lastbg = colbot + out += '▀' + out += '\n' + return out + +if __name__ == '__main__': + parser = argparse.ArgumentParser(description='Render pixel images on 256-color ANSI terminals') + parser.add_argument('image', type=str) + args = parser.parse_args() + img = Image.open(args.image).convert("RGBA") + print(termify_pixels(img)) |