Рубрики
Без рубрики

Преобразование изображения в ASCII с Python

Получите практические, реальные навыки Python на наших ресурсах и пути

Автор оригинала: Mike Driscoll.

Есть много забавных фрагментов Python, что вы можете использовать для преобразования ваших фотографий в ASCII Art. Энтони Шоу, автор и вкладчик в настоящем Питоне, имеет его Собственный фрагмент на Github Отказ Большинство из этих небольших программ используют Пакет подушек Отказ

Эти программы лучше всего работают с простыми изображениями, особенно у которых нет фонов. Программа Shaw использует Анасиколоры Пакет, чтобы добавить немного цвета в ваше искусство ASCII.

Вот программа SHAW в целом:

"""
image2ansi.py
usage: image2ansi.py [-h] [--no-color] [--width WIDTH] path
Display an image in ASCII with ANSI colors
positional arguments:
  path           the path to the image file
optional arguments:
  -h, --help     show this help message and exit
  --no-color     no ANSI colors
  --width WIDTH  output width in characters (Default 120)
Features:
 - Converts ALPHA channel to whitespace (transparency)
 - Uses a sharpness filter to improve the output
Requires:
 - Python 3
 - Pillow 
 - ansicolors
 
Install:
 - pip3 install pillow ansicolors
"""

import argparse
from PIL import Image, ImageEnhance

from colors import color


def render(image_file, width=120, height_scale=0.55, colorize=True):
    img = Image.open(image_file)

    org_width, orig_height = img.size
    aspect_ratio = orig_height / org_width
    new_height = aspect_ratio * width * height_scale
    img = img.resize((width, int(new_height)))
    img = img.convert('RGBA')
    img = ImageEnhance.Sharpness(img).enhance(2.0)
    pixels = img.getdata()

    def mapto(r, g, b, alpha):
        if alpha == 0.:
            return ' '
        chars = ["B", "S", "#", "&", "@", "$", "%", "*", "!", ".", " "]
        pixel = (r * 19595 + g * 38470 + b * 7471 + 0x8000) >> 16
        if colorize:
            return color(chars[pixel // 25], (r, g, b))
        else:
            return chars[pixel // 25]

    new_pixels = [mapto(r, g, b, alpha) for r, g, b, alpha in pixels]
    new_pixels_count = len(new_pixels)
    ascii_image = [''.join(new_pixels[index:index + width]) for index in range(0, new_pixels_count, width)]
    ascii_image = "\n".join(ascii_image)
    return ascii_image


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description='Display an image in ASCII with ANSI colors')

    parser.add_argument('path',
                       metavar='path',
                       type=str,
                       help='the path to the image file ')
    parser.add_argument('--no-color',
                       action='store_true',
                       help='no ANSI colors')
    parser.add_argument('--width',
                       action='store',
                       type=int,
                       default=120,
                       help='output width in characters (Default 120)')
    parser.add_argument('--height-scale',
                        action='store',
                        default=.55,
                        type=float,
                        help='scale ratio for height (default .55')
    args = parser.parse_args()
    print(render(
        args.path, 
        args.width, 
        height_scale=args.height_scale,
        colorize=not args.no_color))

Вы можете использовать эту программу на любом изображении, который у вас есть. Чтобы увидеть, как вы можете использовать эту программу, вы можете использовать эту фотографию автора этой статьи:

Чтобы запустить программу, вы откроете терминал и измените каталоги, пока не находитесь в той же папке, к которой программа сохраняется. Тогда вы запускаете следующую команду:

python3 image2ansi.py my_photo.jpg

При запуске этой программы на изображение выше, вы получите следующий вывод:

Вы можете увидеть, что преобразование удаляет много деталей с изображения, которое следует ожидать.

Теперь давайте попробуем эту программу на прощественную картинку, как Tux, Penguin:

Когда вы запустите image2ansi.py На этом изображении ваш выход будет выглядеть так:

Это преобразование выглядит намного больше похоже на оригинальное изображение, чем предыдущий.

Программы, как image2ansi.py очень весело играть с. Иди, попробуйте или посмотрите, можете ли вы придумать лучшего. Весело и счастливое кодирование!