Créer une animation GIF d'art ASCII avec Python

サンプル

J'ai écrit Python pour créer une animation GIF d'art ASCII à partir de plusieurs images sans signification particulière, je vais donc l'écrire ici car il n'y a pas d'utilisation particulière.

L'image d'exemple ci-dessus a été générée en utilisant les lettres "polikej #", en utilisant huit images pour faire tourner la tête. Le nombre d'images à organiser dans une tuile, la couleur et la taille de la police, etc. sont spécifiés par la variable supérieure au début du script. (L'image d'exemple est créée en modifiant légèrement le code ci-dessous.)

Pour OSX, vous pouvez trouver le chemin de la police dans l'affichage du Finder en vérifiant la police de largeur égale avec Font Book et en cliquant avec le bouton droit de la souris.

Pillow pour l'art ASCII, ImageMagick Pour la génération d'animations GIF. php) est requis. J'utilise un Mac et j'ai installé pip et brew respectivement.

from PIL import Image, ImageDraw, ImageFont
import os.path
import os
import commands


FONT_SIZE = 12
GRID_SIZE = (3, 2)
FONT_COLOR_SET = ("#ffffff", "#000000")
FONT_PATH = 'Chemin de police (largeur égale)'
IMAGE_NAMES = [
    'f0.png',
    'f1.png',
    'f2.png',
    'f3.png',
    'f4.png',
    'f5.png',
    'f6.png',
    'f7.png',
]

FONT_COLOR, FONT_BACKGROUND_COLOR = FONT_COLOR_SET
COLUMNS, ROWS = GRID_SIZE


def image2ascii(input_image):

    original_width, original_height = input_image.size

    width = original_width * COLUMNS
    height = original_height * ROWS

    character, line = "", []
    font = ImageFont.truetype(FONT_PATH, FONT_SIZE, encoding="utf-8")
    input_pix = input_image.load()
    output_image = Image.new("RGBA", (width, height), FONT_BACKGROUND_COLOR)
    draw = ImageDraw.Draw(output_image)

    font_width, font_height = font.getsize("#")

    margin_width = width % font_width
    margin_height = height % font_height

    offset_x = int(round(margin_width / 2))
    offset_y = int(round(margin_height / 2))

    for row in range(ROWS):
        for y in range(offset_y, original_height - offset_y, font_height):
            line = []
            for column in range(COLUMNS):
                for x in range(offset_x, original_width - offset_x, font_width):
                    r, g, b, _ = input_pix[x - offset_x, y - offset_y]
                    gray = r * 0.2126 + g * 0.7152 + b * 0.0722
                    "polikeiji"
                    if gray > 130:
                        character = " "
                    elif gray > 100:
                        character = "i"
                    elif gray > 90:
                        character = "l"
                    elif gray > 80:
                        character = "j"
                    elif gray > 60:
                        character = "o"
                    elif gray > 50:
                        character = "e"
                    elif gray > 40:
                        character = "p"
                    elif gray > 30:
                        character = "k"
                    else:
                        character = "#"
                    line.append(character)
            draw.text((offset_x, y + row * original_height), "".join(line), font = font, fill = FONT_COLOR)
    return output_image

if __name__ == "__main__":
    directory_name = os.path.dirname(IMAGE_NAMES[0])
    if directory_name != '':
        directory_name = directory_name + "/"
    ascii_image_directory = "{0}ascii_{1}_{2}x{3}_{4}_{5}".format(
        directory_name, FONT_SIZE, ROWS, COLUMNS, FONT_COLOR, FONT_BACKGROUND_COLOR)

    for image_name in IMAGE_NAMES:
        print "Input image: {0}".format(image_name)

        with Image.open(image_name) as input_image:
            output_image = image2ascii(input_image)
         
            file_name, extension = os.path.splitext(os.path.basename(image_name))
    
            ascii_image_name = "{0}/ascii_{1}_{2}x{3}_{4}{5}".format(
                ascii_image_directory,
                FONT_SIZE, ROWS, COLUMNS, file_name, extension)

            ascii_image_directory = os.path.dirname(ascii_image_name)
            if not os.path.exists(ascii_image_directory):
                os.makedirs(ascii_image_directory)
    
            output_image.save(ascii_image_name)

            print "Output image: {0}".format(ascii_image_name)

    make_gif_animation_command = "convert -delay 10 -loop 0 {0}/*.png {0}/{1}.gif".format(
        ascii_image_directory, os.path.basename(ascii_image_directory))

    print commands.getoutput(make_gif_animation_command)

Génération d'art ASCII avec oreiller

Veuillez consulter ici, y compris le code. On a l'impression d'examiner une image pixel par pixel et d'attribuer des caractères en fonction de la luminosité.

La taille d'un caractère diffère en fonction de la police, donc je vérifie la taille d'un caractère à l'avance et ajuste pour que l'art ASCII soit centré.

Plus tard, j'ai spécifié une image avec un joker et créé une animation GIF avec ImageMagick, de sorte que les images artisées ASCII sont enregistrées ensemble dans un dossier.

Gif Ani generation avec ImageMagick

Généré simplement avec la commande convert.

convert -delay 10 -loop 0 {dossier}/*.png {dossier}/output.gif

La vitesse change d'une manière ou d'une autre avec l'option de délai, mais il semble que la vitesse diffère selon le spectateur, et il semble que vous ne puissiez pas spécifier exactement le FPS.

Je me suis demandé si je pouvais faire une animation GIF avec Python, mais il n'y avait pas de bibliothèque ou cela semblait ennuyeux. stackoverflow

Recommended Posts

Créer une animation GIF d'art ASCII avec Python
Ne faites pas test.py en Python!
Créer un bookmarklet en Python
Rendre Opencv disponible en Python
Segfo python en 2 lignes
Convertir l'image passée à Jason Stay Samlike en Python en ASCII Art
Segfo python en une ligne
Faites de l'art ASCII avec l'apprentissage en profondeur
Rendre la sortie standard non bloquante en Python
Segfo python en trois lignes
Essayez de dessiner une animation simple en Python
Créer une animation GIF avec surveillance des dossiers
Faisons un calcul de combinaison avec Python
Exécuter régulièrement des tâches de type cron en Python
Quadtree en Python --2
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Convertir le fichier FBX en ASCII <-> BINARY en Python
Méta-analyse en Python
Unittest en Python
Époque en Python
Discord en Python
Copiez la liste en Python
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Créez un jeu Janken en une seule ligne (python)
Plink en Python
Constante en Python
Faisons quelques exemples de traitement des notifications en Python
FizzBuzz en Python
Sqlite en Python
Créez un tracé de R semblable à un joyplot avec python
Étape AIC en Python
LINE-Bot [0] en Python
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Quad-tree en Python
Comment apporter des modifications à l'interpréteur Python dans Pycharm
Réflexion en Python
Chimie avec Python