From 66c99168267f152e057e0cb7bdb776ac5725ed71 Mon Sep 17 00:00:00 2001 From: iou1name Date: Sat, 20 Jan 2018 20:44:04 -0500 Subject: [PATCH] new braille method --- ascii.py | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 68 insertions(+), 6 deletions(-) diff --git a/ascii.py b/ascii.py index 6b578be..454d37b 100755 --- a/ascii.py +++ b/ascii.py @@ -1,5 +1,4 @@ -#! /usr/bin/env python3 -# -*- coding: utf-8 -*- +#!/usr/bin/env python3 """ ASCII """ @@ -16,7 +15,7 @@ BRAIL_CHARS = "⠿⠾⠼⠸⠰⠠ " HEADERS = {'User-Agent': 'Gimme ascii.'} -def scale_image(image, maxDim=100): +def scale_image(image, maxDim=(100,100)): """ Resizes an image while preserving the aspect ratio. Chooses the dimension to scale by based on whichever is larger, ensuring that @@ -27,14 +26,14 @@ def scale_image(image, maxDim=100): """ original_width, original_height = image.size original_width = original_width * 2 - if original_width <= maxDim and original_height <= maxDim: + if original_width <= maxDim[0] and original_height <= maxDim[1]: new_width, new_height = image.size elif original_width > original_height: - new_width = maxDim + new_width = maxDim[0] aspect_ratio = original_height/float(original_width) new_height = int(aspect_ratio * new_width) else: - new_height = maxDim + new_height = maxDim[1] aspect_ratio = original_width/float(original_height) new_width = int(aspect_ratio * new_height) image = image.resize((new_width, new_height)) @@ -223,6 +222,58 @@ def handle_gif(imagePath, **kwargs): numpngw.write_apng(file, np_ascii_seq) +def brail_char(chunk, threshold): + """ + Accepts a numpy matrix and spits out a brail character. + """ + chunk = np.array_split(chunk, 3, axis=0) + chunk = np.concatenate(chunk, axis=1) + chunk = np.array_split(chunk, 6, axis=1) + + dots = "" + for sub_chunk in chunk: + if np.mean(sub_chunk) < threshold: + dots += "1" + else: + dots += "0" + char = chr(int(dots, base=2)+10240) + return char + + +def image_to_brail(image, fontSize=(8,15)): + """ + An alternative method of generating brail ascii art. + """ + if not image: + image = open_image(kwargs["imagePath"]) + + if image.mode == "P": + image = image.convert(image.palette.mode) + if image.mode == "RGBA": + image = alpha_composite(image).convert("RGB") + + image = image.convert("L") + matSize = (image.size[0] // fontSize[0], image.size[1] // fontSize[1]) + if image.size[0] > fontSize[0]*100 or image.size[1] > fontSize[1]*100: + image = scale_image(image, (fontSize[0]*100, fontSize[1]*100)) + image = image.crop((0, 0, matSize[0]*fontSize[0], matSize[1]*fontSize[1])) + + threshold = np.mean(image) + + grid = np.array(image) + grid = np.split(grid, matSize[1], axis=0) + grid = np.concatenate(grid, axis=1) + grid = np.split(grid, matSize[0]*matSize[1], axis=1) + + for n, chunk in enumerate(grid): + char = brail_char(chunk, threshold) + grid[n] = char + + grid = "".join(grid) + grid = [grid[n : n + matSize[0]] for n in range(0, len(grid), matSize[0])] + return "\n".join(grid) + + if __name__=='__main__': import argparse @@ -275,6 +326,11 @@ if __name__=='__main__': "--brail", action="store_true", help="Uses brail unicode characters instead of ascii characters.") + parser.add_argument( + "-B", + "--brail2", + action="store_true", + help="A better braille algorithm for a better you.") args = parser.parse_args() if args.animated: # --animated includes --image @@ -287,6 +343,12 @@ if __name__=='__main__': handle_gif(**vars(args)) exit() + if args.brail2: + image = open_image(args.imagePath) + chars = image_to_brail(image) + print(chars) + exit() + image_ascii = image_to_ascii(None, **vars(args)) if args.drawImage: image = ascii_to_image(image_ascii)