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