Diese Datei ist für das Umwandeln eines normalen Bildes in ein ASCII-Bild zuständig.
import sys from PIL import Image import os import time import click import Abbruch as abh abh.Abbruchsignal()
Diese Bibliotheken werden für „AsciiBildConverter“ importiert.
# Übergabe und Speicherung von FPS des Video (für globale Variable) def UebertrageZuConverter(fpsZahl, invertierung): global fps global booleanInvertierung fps = fpsZahl booleanInvertierung = invertierung
Die Funktion speichert die FPS-Zahl und den Wert für Invertierung ab, welche von der Hauptdatei hier her übertragen werden.
# Schließt Bild für Abbruch def BildFreigeben(): try: bild.close() except Exception: print("")
Die Methode ist für die Abbruch-Datei notwendig. Denn sie schließt das momentan geöffnete Frame (sofern offen), damit der Cache gelöscht werden.
def Umwandlung(zaehler): global bild # global, damit das Bild bei Abbruch geschlossen werden kann # bild-input bild = Image.open("Bildercache/frame%d.jpg" % zaehler) # Groesse des Terminals size = os.get_terminal_size() terminal_breite = int(size.columns) terminal_hoehe = int(size.lines) # Neuskalierung Bild breite, hoehe = bild.size neue_hoehe = terminal_hoehe + 1 # (z.B. 56 Zeilen sichtbar + 1) neue_breite = int(terminal_hoehe + terminal_hoehe*(1/3))*2 # Falls das Terminal zu schmal, wird es auf die Breite angepasst if neue_breite >= terminal_breite: neue_breite = int(terminal_breite - 2) bild = bild.resize((neue_breite, int(neue_hoehe)))
Der Anfang der Funktion befasst sich mit der Größe der Bilder. Zuerst wird die Größe des Terminals ermittelt, damit die Bildausgabe an jede Größe angepasst werden kann (auch wenn man die Größe des Terminals während der Ausführung ändert). Die neue Höhe ist eine Zeile größer als das Terminal, damit oben kein „Flackern“ ist. Die neue Breite haben wir mit einem ungefähren Faktor von Höhe und Breite der Zeichen angepasst, sodass die Ausgabe nicht verzerrt ist. Falls das Terminal zu schmal wird, wird die neue Breite nochmal angepasst.
# Bild in grau bild = bild.convert('L') bild_pixel = bild.getdata() # ersetzt alle Pixel mit den Zeichen if booleanInvertierung: chars = ["@","&","%","§","#","$","e","+","~",",","."," "] # Invertiert else: chars = [" ",".",",","~","+","e","$","#","§","%","&","@"] # Default neue_pixel = [chars[pixel//22] for pixel in bild_pixel] # //22 wegen 256 Pixel insgesamt (256//22) für 12 Zeichen neue_pixel = ''.join(neue_pixel) # splittet String von chars in viele verschiene Strings mit Laenge von neue_breite und erstellt Liste neue_pixel_anzahl = len(neue_pixel) ascii_bild = [neue_pixel[index:index + neue_breite] for index in range(0, neue_pixel_anzahl, neue_breite)] ascii_bild = "\n".join(ascii_bild) print(ascii_bild, end="\r", flush = True) # Zeilenausgabe, end = "\r" für Ersetzen der Zeichen
Das ist der 2. Teil der Funktion „Umwandlung“. Hier am Anfang wird das Bild erstmal in Schwarz-Weiß umgewandelt. Danach findet die Auswahl der Zeichen statt. Je nach Eingabe wird die Reihenfolge getauscht (invertiert). Je nach ermitteltem Helligkeitswert wird das dazugehörige Zeichen in der Tabelle ausgewählt. Diese Zeichen werden dann zu einem Gesamtbild zusammengefügt und nacheinander auf der Konsole ausgegeben.