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