Ich habe ein automatisches AA-Erstellungsprogramm erstellt. Wenn Sie ein Bild mit einem der Schlüsselwörter "URL", "URL" und "Dateipfad" übergeben, wird es automatisch in AA konvertiert.
Hallo. Das bin ich, ein langweiliger Artikelbot seit vielen Jahren. Neulich war meine Notiz wie ein stiller Don ungewöhnlich orange. Überraschenderweise scheint uns der begeisterte Enthusiast von Jason Stasam gefolgt zu sein. Ich habe mehrmals gesehen, dass Sie einen wunderbaren Artikel schreiben, der voller Liebe und Mut ist, aber in diesem Artikel 1 Idol ** Nikonii ** war auf dem Bildschirm, also schreibe ich auch einen Artikel über Jason Stasam! Ich habe nachgedacht. ~~ (Geheimnis) ~~ ** [Dieser Tag](https://qiita.com/tags/%e3%82%b8%e3%82%a7%e3%82%a4%e3%82%bd%e3%83%b3%e3% 83% bb% e3% 82% b9% e3% 83% 86% e3% 82% a4% e3% 82% b5% e3% 83% a0), ich möchte, dass Sie beliebt sind! ** ** **
Sie können Artikel finden, die automatisch "AA" mit "Python" erstellen. Während wir uns auf diesen Bereich beziehen, werden wir ihn mit "Pillow" und "Numpy" implementieren. Referenz 1 ・ Referenz 2
Dieses Mal werde ich ein Schattensystem AA zeichnen. Durch einfaches Anordnen der Zeichen, die der Helligkeit jedes Pixels am nächsten kommen, können Sie endlich so etwas erstellen. Die Breite beträgt 80 Zeichen, was nur der Größe eines kleinen Fensterterminals entspricht. Sie können es jedoch frei anpassen, um es größer zu machen. Wenn Sie es größer machen, erhöht sich die Auflösung zwangsläufig und das Finish wird schön. Wie ist das? Wenn Sie sich das ansehen, wenn Sie müde sind und aufhören, können Sie diese schöne Stimme nicht hören? What the f●ck are you doing? Get back to work or I will beat the shit out of you! ** (Ich weiß nichts über Compliance, weil es eine Stimme ist, die in meinem Gehirn wiedergegeben wird) ** 100-mal energischer, knuspriger arbeiten, Viehzucht in der Firma. Diesmal ist so ein Projekt.
Wie auch immer, es ist cool, es in AA zu sehen.
$ uname -a
Linux raspberrypi 5.4.51-v7l+ #1333 SMP Mon Aug 10 16:51:40 BST 2020 armv7l GNU/Linux
$ python -V
Python 3.7.3
$ pip list
Package Version
------------------- ---------
beautifulsoup4 4.9.2
numpy 1.19.2
Pillow 7.2.0
pip 20.2.3
requests 2.24.0
Wie oben erwähnt, gibt es keinen Präzedenzfall, wenn nur die automatische Erstellung des Farbtons AA erfolgt, daher habe ich einige Änderungen vorgenommen. Ich kann es selbst sagen, aber ich denke, es ist einfacher zu bedienen.
Weisen Sie die zu verwendenden Zeichen entsprechend der Pixelhelligkeit zu. Die diesmal verwendeten Zeichen sind nur die ursprünglichen ASCII-Zeichen, um die Kompatibilität zu verbessern.
jason2aa.py
from PIL import Image, ImageDraw, ImageFont #Ladekissen
import numpy as np #Numpy wird geladen
width = 80 #Breite (Anzahl der Zeichen)
font = ImageFont.truetype('DejaVuSansMono.ttf', 16) #Schriftart für die Kartenerstellung (Razzpie-Standardeinstellung)
characters = list('!"#$%&\'(*+,-./0123456789:;<=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[^_`abcdefghijklmnopqrstuvwxyz{|~ ') #Zu verwendende Zeichenfolge (ASCII-Zeichenfolge)
img_gray = 'hogehoge.png' #Bild zu konvertieren
#Normalisierungsfunktion (0 in der Liste der übergebenen Zahlen-Normalisiert sich auf 255 und kehrt zurück)
def normalize(l):
l_min = min(l) #Mindestwert in der Liste
l_max = max(l) #Maximalwert in der Liste
return [(i - l_min) / (l_max - l_min) * 255 for i in l] #Normalisieren Sie jeden Gegenstand
#Dichteberechnungsfunktion (Liste der übergebenen Zeichen{256-Stufen-Dichte:Brief}Rückgabe als Wörterbucharray von
def calc_density():
l = [] #Deklarieren Sie ein leeres Array, um die Dichte zu setzen
for i in characters: #Wiederholen Sie dies für alle Zeichen
im = Image.new('L', (24,24), 'black') #24px in Graustufen*24px schwarze monochromatische Bilderzeugung
draw = ImageDraw.Draw(im) #Konvertieren Sie das erstellte Bild in ein ImageDrow-Objekt
draw.text((0,0), i, fill='white', font=font) #Zeichnen Sie Text in Weiß auf das Bild
l.append(np.array(im).mean()) #Fügen Sie den Helligkeitsdurchschnitt des Bildes hinzu, in dem die Zeichen zum Array gezeichnet werden
normed = normalize(l) #Normalisieren Sie das Array mit der Helligkeit jedes Zeichens auf 256 Stufen
dict = {key: val for key, val in zip(normed, characters)} # {Luminanz:Brief}Erstellen Sie ein Wörterbucharray von
return sorted(dict.items(), key=lambda x:x[0]) #Sortiert das Wörterbucharray nach Helligkeit und kehrt zurück
maps = calc_density() #Holen Sie sich ein Wörterbuch-Array für die Helligkeit jedes Zeichens
density_map = np.array([i[0] for i in maps]) #Extrahieren Sie nur die Helligkeit und platzieren Sie sie in einem numpy Array
charcter_map = np.array([i[1] for i in maps]) #Extrahieren Sie nur Zeichen und fügen Sie sie in ein numpy-Array ein
imarray = np.array(img_gray) #Numpy Helligkeitsarray pro Pixel im Bild
index = np.searchsorted(density_map, imarray) #Suchen Sie das Zeichen mit der Helligkeit, die der Helligkeit des Pixels am nächsten kommt, und indizieren Sie es in einem numpy-Array
aa = charcter_map[index] #Ausgefallener Index des Zeichen-Numpy-Arrays im obigen Numpy-Array
Es ist fast ein großartiger Artikel hier runde pakuri (sorry), aber das Verhalten beim Zuweisen von Zeichen wurde verbessert.
Die Operation ist etwas schwer, aber die Funktion numpy.searchsorted
kann verwendet werden, um den Farbton genauer auszudrücken.
Dadurch wird es einfacher, Konturen beim Konvertieren von Bildern zu erfassen.
Die Funktion numpy.searchsorted
gibt den Index des Elements, das dem Ziel am nächsten liegt, vom Referenzarray zurück, wenn Sie das Referenzarray
als erstes Argument und das Ziel
als zweites Argument übergeben. [^ 1]
Da das Referenzarray sortiert werden muss und der Index zurückgegeben wird, wird die periphere Verarbeitung wie die Kartenerstellung mithilfe des Wörterbucharrays zwangsweise implementiert.
Nach Konvertieren von zwei Arrays in einen Wörterbuchtyp von Helligkeit und Zeichen und Sortieren nach Schlüssel (Helligkeit) Es wird erneut in zwei Arrays gespeichert: Helligkeit und Buchstaben.
Wenn Sie es wie eine Anwendung verwenden, ist es besser, diese Funktion abzuschaffen und die Karte für eine leichtere Verarbeitung zu korrigieren.
Wenn Sie mit numpy die Helligkeit jedes Pixels des Bildes anordnen und an die Funktion "numpy.searchsorted" übergeben, erhalten Sie ein Array **, in dem die Indizes von Zeichen mit ähnlicher Helligkeit gespeichert werden. Zu Wenn Sie dies mit einer beliebigen Methode exportieren, wird AA abgeschlossen.
Ich werde ein Schlüsselwort an Google Lehrer werfen und das Bild durch Schaben ziehen. Da es sich ohnehin um AA handelt, ist die Bildqualität bei Samne-Qualität ausreichend, sodass die Implementierung einfach ist. Übrigens können Sie "q = Schlüsselwort1 + Schlüsselwort2" als Suchschlüsselwort an Google Teacher und "tbm = isch" als Bildsuchspezifikation übergeben.
jason2aa.py
from bs4 import BeautifulSoup #Bibliothek zum Spielen mit HTML-Knoten
import requests #Steuert die http-Kommunikation"Geeignet für Menschen"Bibliothek
import tempfile #Bibliothek, die temporäre Dateien verwaltet
import re #Bibliothek für reguläre Ausdrücke
import sys #Eine Bibliothek, die höher als Python arbeiten kann
#Bildsuch- / Aufnahmefunktion (gibt die übergebene URL als Bild zurück)
def get_image(destination):
try: #Da es nicht lokal abgeschlossen wird, ist es möglich, einen Fehler anzunehmen und die Ausnahmebehandlung einzubeziehen
html = requests.get(destination).text #Senden Sie eine http-Anfrage und konvertieren Sie die Antwort in das Textformat
soup = BeautifulSoup(html,'lxml') #Geben Sie eine ausgezeichnete lxml für den Parser an (in xml, wenn ein Fehler auftritt)
links = soup.find_all('img') #HTML-Tag<img>Finde alles heraus und extrahiere es
for i in range(10): #Wiederholen Sie diesen Vorgang bis zu 10 Mal, da Sie das Bild möglicherweise nicht aufnehmen können
link = links[random.randrange(len(links))].get('src') #Nach dem Zufallsprinzip<img>Vom Tag"src"Extrahieren Sie eine
if re.match('https?://[\w/:%#\$&\?\(\)~\.=\+\-]+', link): #Bestätigen Sie, dass die extrahierte Zeichenfolge eine URL ist
image = requests.get(link) #Laden Sie das extrahierte Linkbild herunter
image.raise_for_status() #Anforderungsfehler erkennen (z. B. 404)
break #Ich habe es normal verstanden, also gehe ich durch die Schleife
elif i >= 9: #Ich habe es 10 Mal wiederholt, also bin ich aus der Schleife herausgekommen
raise Exception('Oh dear. Couldn\'t find any image.\nWhy don\'t you try with my name?') #Wirf einen Fehler in die oberste Ausnahme und einen benutzerdefinierten Fehler
except Exception as e: #Fangen Sie den Fehler ab
print('Error: ', e) #Standardfehlermeldung
sys.exit(1) #Endcode endet mit 1 (abnormal)
fd, temp_path = tempfile.mkstemp() #Erstellen Sie eine temporäre Datei
with open(temp_path, 'wb') as f: #Temporäre Datei öffnen
f.write(image.content) #Schreiben Sie ein Bild in eine temporäre Datei
return temp_path #Gibt eine temporäre Datei zurück
url = 'https://www.google.com/search?q=Jason+Statham&tbm=isch&safe=off&num=100&pws=0' #Suchen Sie mit dem Google-Lehrer nach dem Bild von Jason Stasam
file_path = get_image(url) #Speichern Sie den Pfad des erfassten Bildes in einer Variablen
Sie können sehr glatt kratzen. Als ich dasselbe in PHP implementierte, dauerte es einige Zeit, daher fand ich es praktisch.
Beachten Sie, dass es sich bei der Anforderungsbibliothek um eine Implementierung auf HTTP-Ebene handelt. Selbst wenn die Antwort beim Ausführen von "request.get ()" 404 Not found "lautet, tritt kein Fehler auf. Da es sich jedoch um einen Fehler beim Scraping handelt, müssen Sie die Fälle selbst trennen. Glücklicherweise können alle Statuscodes außer denen in den 200ern als abnormal angesehen werden, z. B. "404". Wenn Sie also eine praktische Funktion namens "raise_for_status ()" auf die Antwort anwenden, wird ein Fehler ausgelöst, wenn sich der Statuscode nicht in Ihren 200ern befindet. Sie können diesen Fehler mit "außer" aufgreifen und nach Nummer klassifizieren.
Ich habe damit herumgespielt, damit es wie eine App verwendet werden kann. Die Hilfe wird durch Eingabe von "jason2aa.py -h" angezeigt.
Okey, here is the fuckin' help.
Usase: jason2aa.py keyword keyword .. [option]
[Options]
-w Width of AA (The number of characters)
-p Path to image file
-b Return Black and white reversed image
-h Show this help (or -help)
If I was you, I'm sure I can handle such a bullshit app without the help.
Because, I'm a true man.
Ich spreche von Jason Stay Samlike, also habe ich Jason Stay Sam in meinem Gehirn gebeten, mir mit einer Nachricht zu helfen, damit ich nicht "getäuscht" werde. Bitte versuchen Sie verschiedene Fehler auszuspucken. Zum Beispiel, wenn Sie eine Bildschirmbreite übergeben, die nicht "int ()" ist Ich werde es so zurückgeben lol Wenn das Suchwort oder der Pass nicht übergeben wird, wird das Bild von Jason Stasam natürlich zurückgegeben.
Die Breite wird standardmäßig auf die volle Breite der Terminalfenstergröße eingestellt.
Es wird in os.get_terminal_size (). Columns
unter Bezugnahme auf diesen Artikel implementiert.
Ich wollte die Anzahl der zu ladenden Bibliotheken reduzieren, also habe ich es mit os
implementiert.
Der übergebene Pfad wird verarbeitet, um nicht so viele Fehler wie möglich zu verursachen. Bitte lassen Sie mich wissen, wenn ein Fehler auftritt.
Wir haben auch die Schwarz-Weiß-Inversion eingeführt. Es soll in einem Terminal verwendet werden, aber beim Schreiben in das Web usw. ist es im Grunde ein weißer Hintergrund, daher wird es mit der Option -b invertiert.
Es ist notwendig, den ** Kontrast ** zu erhöhen, um das Finish mit dem Farbton AA zu verbessern.
Wenn der Kontrast gering ist, können ** schwarz ** (Leerzeichen
) und ** weiß ** ( M
) nicht verwendet werden und der Umriss ist nicht klar.
Da AA eine kleine Anzahl von Dichteausdrucksschritten aufweist, ist es schwierig zu wissen, was das Bild ist, es sei denn, der Umriss ist klar.
Dieses Mal habe ich aufgrund des Moduls einfach den Kontrast erhöht und ihn dann grau skaliert, aber es scheint, dass eine Methode zur Klärung des Farbtons bei der Konvertierung in Graustufen auch gut ist.
cont = ImageEnhance.Contrast(img) #Erstellen Sie ein Pillow Enhancer-Objekt
img_gray = cont.enhance(2.5).convert('L') #Verdoppelt den Kontrast und wandelt ihn in Graustufen um
Wenn Sie eine Bibliothek haben, können Sie diese kopieren. Ich weiß nicht, ob Nachfrage besteht, aber ich habe sie auf GitHub veröffentlicht. `Ich möchte das Terminal zum Blühen bringen! Wenn Sie eine Person sind, versuchen Sie es bitte.
jason2aa.py
#!/usr/bin/python3.7
from PIL import Image, ImageDraw, ImageFont, ImageEnhance
from bs4 import BeautifulSoup
import numpy as np
import requests
import tempfile
import os
import re
import sys
import random
is_direct = False
is_local = False
background = 'black'
color = 'white'
width = os.get_terminal_size().columns
font = ImageFont.truetype('DejaVuSansMono.ttf', 16)
characters = list('!"#$%&\'(*+,-./0123456789:;<=?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[^_`abcdefghijklmnopqrstuvwxyz{|~ ')
def get_image(destination):
try:
html = requests.get(destination)
html.raise_for_status()
soup = BeautifulSoup(html.text,'lxml')
links = soup.find_all('img')
for i in range(10):
link = links[random.randrange(len(links))].get('src')
if re.match('https?://[\w/:%#\$&\?\(\)~\.=\+\-]+', link):
image = requests.get(link)
image.raise_for_status()
break
elif i >= 9:
raise Exception('Oh dear. Couldn\'t find any image.\nWhy don\'t you try with my name?')
except Exception as e:
print('Error: ', e)
sys.exit(1)
fd, temp_path = tempfile.mkstemp()
with open(temp_path, 'wb') as f:
f.write(image.content)
return temp_path
def normalize(l):
l_min = min(l)
l_max = max(l)
return [(i - l_min) / (l_max - l_min) * 255 for i in l]
def calc_density():
l = []
for i in characters:
im = Image.new('L', (24,24), background)
draw = ImageDraw.Draw(im)
draw.text((0,0), i, fill=color, font=font)
l.append(np.array(im).mean())
normed = normalize(l)
dict = {key: val for key, val in zip(normed, characters)}
return sorted(dict.items(), key=lambda x:x[0])
arg = sys.argv
if '-h' in arg or '-help' in arg:
print(' Okey, here is the fuckin\' help.\n'
'\n'
' Usase: jason2aa.py keyword keyword .. [option]\n'
'\n'
' [Options]\n'
' -w Width of AA (The number of characters, less than 10000)\n'
' -p Path to image file\n'
' -b Return Black and white reversed image\n'
' -h Show this help (or -help)\n'
'\n'
' If I was you, I\'m sure I can handle such a bullshit app without help.\n'
' Because, I\'m a true man.')
sys.exit(0)
if '-b' in arg:
b_index = arg.index('-b')
for i in range(1):
arg.pop(b_index)
background = 'white'
color = 'black'
if '-w' in arg:
w_index = arg.index('-w')
try:
w_temp = int(arg.pop(w_index + 1))
if w_temp > 0 and w_temp < 10000:
width = w_temp
else:
raise Exception
arg.pop(w_index)
except Exception:
print('Watch it! You passed me a invalid argument as width.\nI replaced it with default width.')
for i in range(1):
arg.pop(w_index)
if '-p' in arg:
p_index = arg.index('-p')
try:
path = arg.pop(p_index + 1)
arg.pop(p_index)
if re.match('https?://[\w/:%#\$&\?\(\)~\.=\+\-]+', path):
try:
image = requests.get(path)
image.raise_for_status()
fd, temp_path = tempfile.mkstemp()
with open(temp_path, 'wb') as f:
f.write(image.content)
is_direct = True
file_path = temp_path
except Exception as e:
raise Exception(e)
else:
if os.path.exists(path):
is_local = True
file_path = path
else:
raise Exception('There ain\'t any such file. Are you fucking with me?')
except Exception as e:
print(e, '\nThe above error blocked me accessing the path.\nBut, don\'t worry. Here is the my photo.')
url = 'https://www.google.com/search?q=Jason+Statham&tbm=isch&safe=off&num=100&pws=0'
file_path = get_image(url)
else:
if len(arg) <= 1:
arg = ['Jason', 'Statham']
else:
arg.pop(0)
url = 'https://www.google.com/search?q=' + '+'.join(arg) + '&tbm=isch&safe=off&num=100&pws=0'
file_path = get_image(url)
for i in range(10):
try:
img = Image.open(file_path)
except Exception:
print('Oh, fuck you! I couldn\'t open the file.\n'
'It\'s clearly your fault, cuz the path wasn\'t to image file.\n'
'But, possibly, it\'s caused by error like 404. Sorry.')
sys.exit(1)
if img.mode == 'RGB':
cont = ImageEnhance.Contrast(img)
img_gray = cont.enhance(2.5).convert('L').resize((width, int(img.height*width/img.width//2)))
break
elif is_local or is_direct:
print('Shit! I could only find only useless image.\nYou pass me files containing fuckin\' alpha channel, aren\'t you?.')
sys.exit(1)
elif i >= 9:
print('Damm it! I could only find only useless image.\nMaybe, fuckin\' alpha channel is contained.')
sys.exit(1)
else:
os.remove(file_path)
file_path = get_image(url)
maps = calc_density()
density_map = np.array([i[0] for i in maps])
charcter_map = np.array([i[1] for i in maps])
imarray = np.array(img_gray)
index = np.searchsorted(density_map, imarray)
aa = charcter_map[index]
aa = aa.tolist()
for i in range(len(imarray)):
print(''.join(aa[i]))
if not is_local:
os.remove(file_path)
sys.exit(0)
Ich bin eine unerfahrene Person, also habe ich zum ersten Mal mit Python gespielt. Ich habe es genossen, in einer sehr benutzerfreundlichen und vertrauten Sprache zu schreiben.
Sie können herausfinden, wie viele AAs automatisch erstellt werden können, indem Sie das Web durchsuchen. Als ich es jedoch selbst erstellt habe, war es interessant, es aus einer anderen Perspektive zu betrachten, z. B. durch die Erstellung von Zuordnungen. Wenn ich Zeit habe, möchte ich auch ** AA ** des ** Strichzeichnungssystems ** schreiben, indem ich "CV2" und "Konturerkennung" voll ausnutze.
Wenn Sie Ratschläge oder Vorschläge haben, würde ich mich freuen, wenn Sie mich wissen lassen könnten. Bis zum Ende Danke fürs Lesen!
[^ 1]: Das genaue Verhalten ist unterschiedlich. Weitere Informationen finden Sie im Offiziellen Dokument.
Recommended Posts