[Python] Ich habe einen einfachen Code geschrieben, der automatisch AA generiert (Ascii Art).

Einführung

Jeder, ihr kennt ** AA (Ascii Art) **. Es ist eine Handwerkskunst, nicht wahr? Einmal dein Lieblingsbild, dein Lieblingscharakter oder du selbst? Wollten Sie schon immer einmal AA machen? Dieses Mal werde ich nicht so weit gehen wie ein AA-Handwerker, aber ich habe einen Code geschrieben, der mit meinen Lieblingsfiguren ** leicht AA ** aus meinem Lieblingsbild generiert **, also möchte ich ihn vorstellen. Ich werde.

Der in diesem Artikel eingeführte Code kann beispielsweise für die folgenden Konvertierungen verwendet werden. Bildverlag: Irasutoya

Methode

AA von AA-Handwerkern drücken Konturen oft effektiv mit / usw. aus und drücken Illustrationen mit einer kleinen Anzahl von Zeichen aus, aber dieses Mal möchte ich es mit brutaler Gewalt tun, ohne so komplizierte Dinge zu tun Überlegen. Die Methode ist einfach: ** Wenden Sie die Zeichen in der Reihenfolge ihrer Dichte auf 256 Helligkeitsstufen auf der Graustufe an **. Lass uns gehen.

Implementierung

Lesen Sie zuerst das Bild der Konvertierungsquelle in Graustufen und machen Sie es zu einem "Numpy Array".

AA.py


from PIL import Image
import numpy as np

file_path = "./hogehoge.png "
imag = Image.open(file_path).convert('L')
imarray = np.asarray(imag)

Zu diesem Zeitpunkt ist der in "imarray" gespeicherte Wert eine ganze Zahl von 0 bis 255 (2 ^ 8 Schritte). Dies ist die einzige Vorbereitung auf der Bildseite.

Sortieren Sie als Nächstes die zu verwendenden Zeichen in der Reihenfolge ihrer Dichte. Ich werde es tun, aber ich weiß nicht, wie ich mit Schriftdateien umgehen soll, und selbst wenn ich es tue, kann ich mir keine Möglichkeit vorstellen, die Dichte von Bildern im Vektorformat zu messen. Die Methode, die ich mir ausgedacht habe, war, es einmal in ein Bild (Raster) einzufügen und dann die Summe oder den Durchschnitt davon zu berechnen und zu vergleichen.

AA.py


from PIL import ImageDraw,ImageFont

def make_map(str_list):
    l = []
    font = ImageFont.truetype('msgothic.ttc', 20) #"C:\Windows\Fonts"In Ihrer Lieblingsschrift (oder schreiben Sie aus dem Pfad)#Wenn kein Fehler vorliegt, ist es in Ordnung
    for i in str_list:
        im = Image.new("L",(20,20),"white") #Erstellen eines weißen Hintergrundbildes des Himmels
        draw = ImageDraw.Draw(im)
        draw.text((0,0),i,font=font) #Zeichen einfügen
        l.append(np.asarray(im).mean()) #
    l_as = np.argsort(l) #Index der aufsteigenden Art des Dichteindex
    lenl = len(l)
    l2256 = np.r_[np.repeat(l_as[:-(256%lenl)],256//lenl),np.repeat(l_as[-(256%lenl):],256//lenl+1)] #Stellen Sie die Anzahl der Elemente auf 256 ein
    chr_map = np.array(str_list)[l2256] #Zeichenliste sortiert nach Dichte
    return chr_map

Diese Funktion sortiert nach Dichte und gibt sie als "Nampy-Array" zurück, wenn Sie eine Liste von Zeichen übergeben.

Übrigens gibt es eine Funktion, die mir persönlich gefällt: Wenn Sie ein Array übergeben, in dem ein Index als Index gespeichert ist, wird das angegebene Element ("Fancy Index") abgerufen. Um ein Beispiel zu geben

python


import numpy as np

arr=np.array(["Ah","ich","U.","e","Oh"])
print(arr[[1,1,4,3,2,0]])

Ausgabe


['ich' 'ich' 'Oh' 'e' 'U.' 'Ah']

** Hmm, ich liebe Numpy. ** ** **

Dieses Mal können Sie es mit dieser Funktion ** sofort falten **.

AA.py


str_list = list("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +-*/%'"+'"!?#&()~^|@;:.,[]{}<>_0123456789') #Bereiten Sie die Zeichen vor, die Sie verwenden möchten
chr_map = make_map(str_list) #Sortieren nach Dichte,
aa = chr_map[imarray] #Ausgefallene Sorte! !! !!

Ja, dies allein vervollständigt die in AA konvertierten Daten in ** aa **.

Danach können Sie es in eine TXT-Datei schreiben oder als Standardausgabe ausgeben, damit es leicht zu sehen ist.

AA.py


aa = aa.tolist() #In Liste konvertieren
out_path="./aa.txt"
with open(out_path,"w") as f:
    for i in range(len(imarray)):f.write(''.join(aa[i])+"\n")

Oder

AA.py


aa = aa.tolist()
for i in range(len(imarray)):print(''.join(aa[i]))

das ist alles. Es war einfach.

Schließlich

Ändern Sie die Ausgabegröße und wählen Sie volle Breite / halbe Breite (Referenz: [Python] Gegenseitige Konvertierung zwischen voller Breite und halber Breite in einer Zeile (Alphabet + Zahl + Symbol)) Hier ist eine Liste von Funktionen, die mit detaillierten Funktionen wie hinzugefügt wurden

AA.py


from PIL import Image, ImageDraw,ImageFont
import numpy as np

def make_map(str_list):
    l=[]
    font = ImageFont.truetype('msgothic.ttc', 20)
    for i in str_list:
        im = Image.new("L",(20,20),"white")
        draw = ImageDraw.Draw(im)
        draw.text((0,0),i,font=font)
        l.append(np.asarray(im).mean())
    l_as=np.argsort(l)
    lenl=len(l)
    l2256=np.r_[np.repeat(l_as[:-(256%lenl)],256//lenl),np.repeat(l_as[-(256%lenl):],256//lenl+1)]
    chr_map=np.array(str_list)[l2256]
    return chr_map

def output(chr_map,imarray,isOutText,out_path):
    aa=chr_map[imarray].tolist()
    if isOutText:
        with open(out_path,"w") as f:
            for i in range(len(imarray)):f.write(''.join(aa[i])+"\n")
    else:
        for i in range(len(imarray)):print(''.join(aa[i]))

def make_AA(file_path,str_list="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +-*/%'"+'"!?#&()~^|@;:.,[]{}<>_0123456789',width=150,isOutText=False,out_path="aa.txt",isFW=False):
    imag=Image.open(file_path).convert('L')
    if isFW:str_list=list(str_list.translate(str.maketrans({chr(0x0021 + i): chr(0xFF01 + i) for i in range(94)})))
    else:str_list=list(str_list)
    imarray=np.asarray(imag.resize((width,width*imag.height//imag.width//(2-int(isFW)))))
    output(make_map(str_list),imarray,isOutText,out_path)

Dies ist die Funktion, die make_AA () von hier aus ausführt, wenn sie verwendet wird. Die Argumente sind "Dateipfad": der Pfad des Originalbilds, "str_list": die zu verwendende Zeichenfolge (Zeichenfolge anstelle der Liste), "width": die Anzahl der horizontalen Zeichen (vertikal wird automatisch angepasst), "isOutText" : Wenn True, wird es in die TXT-Datei ausgegeben. (Standardmäßig False), out_path: Ausgabeziel und Dateiname der TXT-Datei, wenn isOutText True ist, isFW: Auf True setzen, wenn Zeichen voller Breite enthalten sind oder wenn Sie in voller Breite ausgeben möchten Bitte (kurz für Full Width) Es kann verwendet werden, ohne etwas anderes als "Dateipfad" anzugeben (in diesem Fall ist die Standardausgabe 150 Zeichen breit).

Zusammenfassung

Es ist einfach, aber ich habe ein Programm zur Erstellung von AA eingeführt. Übrigens: Wenn Sie den Kontrast des Originalbilds als Vorprozess erhöhen, wird das Finish aktualisiert. Ich hoffe es wird für Sie hilfreich sein. Ich wäre Ihnen dankbar, wenn Sie uns Ihre Eindrücke und Ratschläge geben könnten.

Recommended Posts

[Python] Ich habe einen einfachen Code geschrieben, der automatisch AA generiert (Ascii Art).
Ein Memo, das ich schnell in Python geschrieben habe
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe einen Code geschrieben, um die Quaternion mit Python in einen Ölerwinkel vom Typ z-y-x umzuwandeln
Erstellen wir eine Kundendatenbank, in der QR-Code automatisch in Python ausgegeben wird
Code lesen von faker, einer Bibliothek, die Testdaten in Python generiert
[Python] Ich habe einen Web-Scraping-Code erstellt, der automatisch den Nachrichtentitel und die URL von Nihon Keizai Shimbun erfasst.
Ich habe eine Klasse in Python3 und Java geschrieben
Ich habe eine Animation geschrieben, bei der das lineare System mit tödlich schmutzigem Code schrumpft
Vim-Plug-In, das automatisch Python-Stile formatiert
Ich habe ein Programm erstellt, um Bilder mit Python und OpenCV in ASCII-Grafik umzuwandeln
[Mac] Ich möchte einen einfachen HTTP-Server erstellen, auf dem CGI mit Python ausgeführt wird
mong - Ich habe versucht, den Code, der zufällig den Containernamen von Docker generiert, nach Python zu portieren. -
Ich habe Python-Code geschrieben, um ein Tabellen- (Ansichts-) Abhängigkeitsdiagramm (PlantUML) aus SQL zu erstellen
Schreiben wir Python-Code, der Go-Code analysiert und Go-Code generiert
Ich habe eine VM erstellt, auf der OpenCV für Python ausgeführt wird
Ein Memo, dass ich den Datenspeicher mit Python berührt habe
Ich hatte das Gefühl, dass ich den Python-Code nach C ++ 98 portiert habe.
Ich habe ein Python-Skript geschrieben, das alle meine Beiträge mit der Qiita API v2 exportiert
Ich habe mit LightGBM einen Code geschrieben, der die Wiederherstellungsrate von 100% bei der Vorhersage von Pferderennen überschreitet (Teil 2).
Ich habe versucht, einen Generator zu erstellen, der mit Python eine C # -Containerklasse aus CSV generiert
[Python] Ich habe einen Test von "Streamlit" geschrieben, der das Erstellen von Visualisierungsanwendungen erleichtert.
Ich habe ein einfaches Tippspiel mit tkinter of Python gemacht
Ein String-Sortiercode, der einen Algorithmus verwendet, der eine Permutation generiert.
Ich habe schnell ein Programm geschrieben, um DI mit Python zu lernen
Python-Bedingungsextraktion aus der Liste, die ich oft vergesse
Ich habe eine einfache Buch-App mit Python + Flask ~ Introduction ~ erstellt
Ich habe versucht, "ein Programm, das doppelte Anweisungen in Python entfernt"
Erstellen Sie den Code, der in Python "A und vorgeben B" ausgibt
Ich habe gerade das Originalmaterial für den Python-Beispielcode geschrieben
Ich habe ein Skript geschrieben, das das Bild in zwei Teile teilt
[Python] Ich habe versucht, mit argparse ein einfaches Programm zu erstellen, das in der Befehlszeile funktioniert
Ich habe Python auf Japanisch geschrieben
Ich habe einen Python-Text gemacht
[Python] Ich habe einen Line-Bot erstellt, der zufällig nach englischen Wörtern fragt
Ich habe eine einfache Schaltung mit Python gemacht (AND, OR, NOR, etc.)
Ich habe ein Paket erstellt, das morphologische Analysegeräte mit Python vergleichen kann
Ich möchte einen Platzhalter verwenden, den ich mit Python entfernen möchte
[Python] Ein Memo, das ich versucht habe, mit Asyncio zu beginnen
Ich habe den Code geschrieben, um den Brainf * ck-Code in Python zu schreiben
Ich habe eine Funktion zum Laden des Git-Erweiterungsskripts in Python geschrieben
[Python] Ich habe einen Bildbetrachter mit einer einfachen Sortierfunktion erstellt.
Ich habe ein Shuffle gemacht, das mit Python zurückgesetzt (zurückgesetzt) werden kann
Ich habe ein Skript geschrieben, um Webseiten-Links in Python zu extrahieren
[Python] Ich habe eine REST-API mit AWS API Gateway und Lambda geschrieben.
Ich habe ein Programm erstellt, das den Tierkreis mit tkinter automatisch berechnet
[Python] Ich habe eine Klasse erstellt, die schnell einen Dateibaum schreiben kann
Ich habe einen Tri-Tree geschrieben, der für die Implementierung von Hochgeschwindigkeitswörterbüchern in D-Sprache und Python verwendet werden kann