Erstellen Sie mit Python eine GIF-Animation für ASCII-Grafiken

サンプル

Ich habe Python geschrieben, um ASCII-Kunst-GIF-Animationen aus mehreren Bildern ohne besondere Bedeutung zu erstellen. Deshalb werde ich sie hier schreiben, da es keine besondere Verwendung gibt.

Das obige Beispielbild wurde mit den Buchstaben "polikej #" erstellt, wobei acht Bilder verwendet wurden, um den Kopf zu drehen. Die Anzahl der Bilder, die in einer Kachel angeordnet werden sollen, die Farbe und Größe der Schriftart usw. werden durch die obere Variable am Anfang des Skripts angegeben. (Das Beispielbild wird durch leichtes Ändern des folgenden Codes erstellt.)

Unter OSX finden Sie den Schriftpfad in der Finder-Anzeige, indem Sie die Schrift mit der gleichen Breite mit "Schriftbuch" überprüfen und mit der rechten Maustaste klicken.

Pillow für ASCII-Grafiken, ImageMagick Für die Generierung von GIF-Animationen. PHP) ist erforderlich. Ich benutze einen Mac und habe Pip bzw. Brew installiert.

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 = 'Schriftpfad (gleiche Breite)'
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)

ASCII Kunstgeneration mit Kissen

Bitte lesen Sie hier einschließlich des Codes. Es fühlt sich an, als würde man ein Bild Pixel für Pixel untersuchen und Zeichen entsprechend der Helligkeit zuweisen.

Die Größe eines Zeichens hängt von der Schriftart ab. Daher überprüfe ich die Größe eines Zeichens im Voraus und passe sie so an, dass die ASCII-Grafik zentriert ist.

Später habe ich ein Bild mit einem Platzhalter angegeben und mit ImageMagick eine GIF-Animation erstellt, sodass die ASCII-Bilder zusammen in einem Ordner gespeichert werden.

Gif Ani Generation mit ImageMagick

Einfach mit dem Befehl convert generiert.

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

Die Geschwindigkeit ändert sich irgendwie mit der Verzögerungsoption, aber es scheint, dass die Geschwindigkeit je nach Viewer unterschiedlich ist und Sie anscheinend nicht genau FPS angeben können.

Ich fragte mich, ob ich mit Python eine GIF-Animation erstellen könnte, aber es gab keine Bibliothek oder es schien nervig zu sein. stackoverflow

Recommended Posts

Erstellen Sie mit Python eine GIF-Animation für ASCII-Grafiken
Mach nicht test.py in Python!
Erstellen Sie ein Lesezeichen in Python
Stellen Sie Opencv in Python zur Verfügung
Segfo Python in 2 Zeilen
Konvertieren Sie das an Jason Stay Samlike in Python übergebene Bild in ASCII Art
Segfo Python in einer Zeile
Machen Sie ASCII-Kunst mit tiefem Lernen
Machen Sie die Standardausgabe in Python nicht blockierend
Segfo Python in drei Zeilen
Versuchen Sie, eine einfache Animation in Python zu zeichnen
Erstellen Sie eine GIF-Animation mit Ordnerüberwachung
Lassen Sie uns eine Kombinationsberechnung mit Python durchführen
Stellen Sie sicher, dass in Python regelmäßig Cron-ähnliche Jobs ausgeführt werden
Quadtree in Python --2
Python in der Optimierung
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Konvertieren Sie die FBX-Datei in Python in ASCII <-> BINARY
Metaanalyse in Python
Unittest in Python
Epoche in Python
Zwietracht in Python
Kopieren Sie die Liste in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Mach ein Janken-Spiel in einer Zeile (Python)
Plink in Python
Konstante in Python
Lassen Sie uns einige Beispiele für die Benachrichtigungsverarbeitung in Python erstellen
FizzBuzz in Python
SQLite in Python
Machen Sie mit Python eine Joyplot-ähnliche Handlung von R.
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
So nehmen Sie Python Interpreter-Änderungen in Pycharm vor
Reflexion in Python
Chemie mit Python