Узнайте, как сгенерировать искусство ASCII из изображения с помощью Python.

Шаги по преобразованию изображения в символ ASCII

  • Загрузить изображение
  • Изменить размер изображения
  • Преобразовать изображение в GreyScale
  • Преобразование данных GreyScale каждого пикселя в соответствующий символ ASCII

Загрузка изображения с использованием библиотеки изображений PIL

Для загрузки изображения мы будем использовать PIL библиотеку.

import PIL.Image

def main():
    path = input("Enter the path to the image fiel : \n")
    try:
        image = PIL.Image.open(path)
    except:
        print(path, "Unable to find image ");

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

Определить список ASCII

Давайте создадим список символов ASCII,

ASCII_CHARS = ["@", "#", "$", "%", "?", "*", "+", ";", ":", ",", "."]

Символы ASCII расположены от самых темных до самых светлых. Это означает, что самый темный пиксель будет заменен на @, а самый светлый - на ..

Изменить размер изображения

Нам нужно преобразовать изображение в небольшую ширину и высоту, чтобы в результате не получился текст большого размера. Чтобы найти new_height, умножьте new_width на old_height, затем разделите на old_width.

def resize(image, new_width = 100):
    width, height = image.size
    new_height = new_width * height / width
    return image.resize((new_width, new_height))

Преобразовать изображение в шкалу серого

Мы можем использовать метод convert на image с опцией L, чтобы получить изображение в масштабе серого.

def to_greyscale(image):
    return image.convert("L")

Преобразование изображения шкалы серого в символ ASCII

Чтобы сначала преобразовать изображение в символ ASCII, получите значение каждого пикселя(0-255). Получите соответствующий символ ASCII и объедините их как строку

def pixel_to_ascii(image):
    pixels = image.getdata()
    ascii_str = "";
    for pixel in pixels:
        ascii_str += ASCII_CHARS[pixel//25];
    return ascii_str

Теперь у нас есть метод to_greyscale для преобразования изображения в изображение GreyScale, метод pixel_to_ascii для преобразования изображения GreyScale в строку ASCII, как только мы получим строку ASCII изображения, нам нужно разделить строку на основе ширины изображение и сохраните его в файл.

import PIL.Image
def main():
    path = input("Enter the path to the image fiel : \n")
    try:
        image = PIL.Image.open(path)
    except:
        print(path, "Unable to find image ")
    #resize image
    image = resize(image);
    #convert image to greyscale image
    greyscale_image = to_greyscale(image)
    # convert greyscale image to ascii characters
    ascii_str = pixel_to_ascii(greyscale_image)

    img_width = greyscale_image.width
    ascii_str_len = len(ascii_str)
    ascii_img=""
    #Split the string based on width  of the image
    for i in range(0, ascii_str_len, img_width):
        ascii_img += ascii_str[i:i+img_width] + "\n"
    #save the string to a file
    with open("ascii_image.txt", "w") as f:
        f.write(ascii_img);
main()

Спасибо за прочтение. Следуйте Javascript Jeep🚙💨 для получения дополнительных руководств

Уровень кодирования

Спасибо, что стали частью нашего сообщества! Подпишитесь на наш канал YouTube или присоединитесь к Интервью по программированию Skilled.dev.