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)
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.
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