X-Git-Url: https://vcs.fsf.org/?p=rainbowstream.git;a=blobdiff_plain;f=rainbowstream%2Fc_image.py;h=e4d450564d203a10ab92a03fe6e87d949dc81ae3;hp=96cab29fd89aae50b0572e9aa33695f8f0b2d317;hb=1adf5dd916956546205cae0b7baa37f4faeaf5fa;hpb=13e6b275faf7b7fbc869c4f7ed2baa20346b0ed5 diff --git a/rainbowstream/c_image.py b/rainbowstream/c_image.py index 96cab29..e4d4505 100644 --- a/rainbowstream/c_image.py +++ b/rainbowstream/c_image.py @@ -15,8 +15,8 @@ def call_c(): library = expanduser('~/.image.so') sauce = join(dirname(__file__), 'image.c') if not exists(library) or getmtime(sauce) > getmtime(library): - build = "gcc -fPIC -shared -o %s %s" % (library, sauce) - assert os.system(build + " >/dev/null 2>&1") == 0 + build = "cc -fPIC -shared -o %s %s" % (library, sauce) + os.system(build + " >/dev/null 2>&1") image_c = ctypes.cdll.LoadLibrary(library) image_c.init() return image_c.rgb_to_ansi @@ -31,6 +31,14 @@ def pixel_print(ansicolor): sys.stdout.write('\033[48;5;%sm \033[0m' % (ansicolor)) +def block_print(lower, higher): + """ + Print two pixels arranged above each other with Ansi color. + Abuses Unicode to print two pixels in the space of one terminal block. + """ + sys.stdout.write('\033[38;5;%sm\033[48;5;%sm▄\033[0m' % (higher, lower)) + + def image_to_display(path, start=None, length=None): """ Display an image @@ -46,16 +54,18 @@ def image_to_display(path, start=None, length=None): i.load() width = min(w, length) height = int(float(h) * (float(width) / float(w))) - height //= 2 i = i.resize((width, height), Image.ANTIALIAS) height = min(height, c['IMAGE_MAX_HEIGHT']) - for y in xrange(height): + for real_y in xrange(height // 2): sys.stdout.write(' ' * start) for x in xrange(width): - p = i.getpixel((x, y)) - r, g, b = p[:3] - pixel_print(rgb2short(r, g, b)) + y = real_y * 2 + p0 = i.getpixel((x, y)) + p1 = i.getpixel((x, y+1)) + r0, g0, b0 = p0[:3] + r1, g1, b1 = p1[:3] + block_print(rgb2short(r0, g0, b0), rgb2short(r1, g1, b1)) sys.stdout.write('\n')