Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

ws2122:asciia:asciibildconverter.py:start

Dies ist eine alte Version des Dokuments!


AsciiBildConverter.py:

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.

def UebertrageZuConverter(fpsZahl, invertierung): # Übergabe und Speicherung von FPS des Video (für globale Variable)
    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.

def Umwandlung(zaehler):
 
    # 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
    neu_hoehe = terminal_hoehe + 1
    neu_breite = int(terminal_hoehe + terminal_hoehe*(1/3))*2
 
    if neu_breite >= terminal_breite: # Falls Terminal zu schmal, wird es auf die breite angepasst
        neu_breite = int(terminal_breite - 2)
 
    bild = bild.resize((neu_breite, int(neu_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, damit 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","$","#","§","%","&","@"] # für Default-Farbe (ohne Farbe)
    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 neu_breite und erstellt Liste
    neue_pixel_count = len(neue_pixel)
    ascii_bild = [neue_pixel[index:index + neu_breite] for index in range(0, neue_pixel_count, neu_breite)]
    ascii_bild = "\n".join(ascii_bild)
    print(ascii_bild, end="\r", flush = True)

Das ist der 2. Teil der Funktion „Umwandlung“. Hier am Anfang wird das Bild erstmal in Schwarz-Weiß umgewandelt. Danach wird 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.

ws2122/asciia/asciibildconverter.py/start.1647442990.txt.gz · Zuletzt geändert: 2022/03/16 16:03 von Jaden