Wenn ich eine reine Textdatei habe, wie kann ich sie über die Befehlszeile in eine Bilddatei konvertieren? (und dabei das Layout der darin enthaltenen ASCII-Grafik beibehalten)
Antwort1
imagemagick
ist hier dein Freund. Etwas Ähnliches wie das Folgende könnte dir helfen:-
convert -size 360x360 xc:white -font "FreeMono" -pointsize 12 -fill black -draw @ascii.txt image.png
wo ascii.txt
ist Ihre ASCII-Art-Datei: -
text 15,15 " .88888888:.
88888888.88888.
.8888888888888888.
888888888888888888
88' _`88'_ `88888
88 88 88 88 88888
88_88_::_88_:88888
88:::,::,:::::8888
88`:::::::::'`8888
.88 `::::' 8:88.
8888 `8:888.
.8888' `888888.
.8888:.. .::. ...:'8888888:.
.8888.' :' `'::`88:88888
.8888 ' `.888:8888.
888:8 . 888:88888
.888:88 .: 888:88888:
8888888. :: 88:888888
`.::.888. :: .88888888
.::::::.888. :: :::`8888'.:.
::::::::::.888 ' .::::::::::::
::::::::::::.8 ' .:8::::::::::::.
.::::::::::::::. .:888:::::::::::::
:::::::::::::::88:.__..:88888:::::::::::'
`'.:::::::::::88888888888.88:::::::::'
`':::_:' -- '' -'-' `':_::::'`
"
mit text 15,15
als erste Textzeile hinzugefügt (15,15 ist ein Positionsversatz). Stellen Sie außerdem sicher, dass der tatsächlich zu konvertierende Text in Anführungszeichen eingeschlossen ist. Einfache oder doppelte Anführungszeichen reichen aus, stellen Sie jedoch sicher, dass sie nicht als Teil Ihrer ASCII-Grafik verwendet werden, da dies Verwirrung stiftet.
Die von Ihnen gewählte Schriftart sollte eine Monospace-Schriftart sein, da der Text sonst nicht ausgerichtet wird.
Dies führt zu:
Antwort2
Ich finde den Operator von ImageMagick -annotate
etwas praktischer als die von -draw
garethTheRed vorgeschlagene Methode, aus dem einfachen Grund, dass er keine Änderung der Eingabedatei erfordert. Er ist nicht so leistungsstark wie -draw
, aber für das vollständige Einfügen des Inhalts einer Textdatei in ein Bild ist er völlig ausreichend.
convert -size 360x360 xc:white -font "FreeMono" -pointsize 12 -fill black \
-annotate +15+15 "@ascii.txt" image.png
gibt eine gerenderte Version des angegebenen Dateiinhalts aus, ohne dass Sie Ihre Datei „ascii.txt“ ändern müssen, damit sie den text 15x15
Teil des -draw
Primitivs enthält.
Angeben von Argumenten
Das Argument für -font
kann jeder unterstützte Schriftartname sein, wenn FreeMono nicht verfügbar ist (oder einfach nicht gewünscht wird). Eine Liste der für jeden ImageMagick-Befehl verfügbaren Schriftarten kann mit dem -list
Operator abgerufen werden, daher convert -list font
werden alle möglichen Argumente für angezeigt -font
.
Die Argumente -annotate
(wie weit der gerenderte Text vom Rand der Leinwand verschoben werden soll) bestehen aus horizontalen und vertikalen Pixel-Offsets (jeweils). Das erste Offset (horizontale X-Verschiebung) kann jede beliebige positive Ganzzahl sein, muss aber nicht größer als ein paar Pixel sein. Das zweite Offset (vertikale Y-Verschiebung)mussSeimindestensgleich der Punktgröße der gewählten Schriftart (das Argument für -pointsize
), da ImageMagick dieBasislinieder Schriftart beim angegebenen Versatz. Wenn Sie die Schriftart also nicht mindestens um pointsize
Pixel nach unten verschieben, wird die Oberseite der ersten Zeile abgeschnitten.
Ich empfehle, mindestens mehrere Pixel darüber hinauszugehen. Wenn Sie also -pointsize 64
dann verwenden, sollten Sie dies mit etwas wie kombinieren -annotate +15+80
. (Es gibt keinen Grund, den horizontalen Versatz bei größeren Schriftgrößen zu erhöhen, er hat nichts mit den Textabmessungen zu tun.)
Es kann auch mühsam sein, die erforderlichen Abmessungen des Ausgabebildes schätzen zu müssen. Normalerweise wähle ich einfach zu große Werte aus und nutze dann ImageMagicks -trim
und -border
um das Ergebnis automatisch zuzuschneiden. Der folgende Befehl:
convert -size 1000x2000 xc:white -font "FreeMono" -pointsize 12 -fill black \
-annotate +15+15 "@ascii.txt" -trim -bordercolor "#FFF" -border 10 +repage image.png
wird in ein 1000 x 2000 großes Feld gerendert und schneidet dann den überschüssigen weißen Raum bis auf einen 10 Pixel breiten Rand rund um den Text ab. Das +repage
ganz am Ende verhindert, dass das Ausgabe-PNG mit einem Bildversatz erstellt wird, was sonst dazu führen würde, dass GIMP beim Laden ein Dialogfeld mit der Frage öffnet, ob der Versatz angewendet werden soll.
(1000 x 2000 ist für kleine Textdateien offensichtlich zu viel und bei längeren Dateien muss möglicherweise zumindest die vertikale Dimension vergrößert werden. Es ist jedoch einfacher, die Größe zu überschätzen, da die einzigen Kosten darin bestehen, dass convert
während der Verarbeitung etwas mehr CPU und Speicher verbraucht werden.)
Vorverarbeitung der Eingabe
Wenn Ihre Textdatei noch nicht so formatiert ist, wie Sie sie zum Rendern benötigen (z. B. wenn sie sehr lange Zeilen enthält), müssen Sie sie möglicherweise neu formatieren, bevor Sie sie an übergeben convert
. ImageMagick umbricht den Text nicht, sodass jede Textzeile horizontal ihre volle Länge hat. Glücklicherweise ist es möglich, die Datei durch beliebige Befehlszeilenformatierer laufen zu lassen und den verarbeiteten Text dann in weiterzuleiten, convert
anstatt ihn direkt aus der Datei zu lesen:
fmt < ascii.txt | convert -size 1000x2000 xc:white -font "DejaVu-Sans-Condensed" \
-pointsize 24 -fill black -annotate +15+30 "@-" -trim -bordercolor "#FFF" \
-border 10 +repage image.png
Dadurch wird der Inhalt ascii.txt
in 24-Punkt-DejaVu Sans Condensed gerendert.naches wurde vom fmt
Befehl verarbeitet, der in seinem Standardbetriebsmodus seine Eingabe durch Zeilenumbruch auf eine Breite von 75 Spalten neu formatiert. (Es sei denn, es gibt lange fortlaufende Zeichenfolgen mit mehr als 75 Zeichen, wie z. B. URLs, in diesem Fall erstrecken sie sich über die Breite.)
Sobald fmt
der Text neu formatiert wurde, wird er an übergeben, convert
das dann die Pipe-Ausgabe rendert fmt
, so als ob die Datei direkt gelesen würde. (Die Angabe eines Dateinamens -
ist eine recht gängige Abkürzung in der UNIX-Shell für „Von der Standardeingabe lesen, statt einer beliebigen benannten Datei auf der Festplatte“, und die Tools von ImageMagick folgen dieser Konvention.)
Antwort3
Sie könnten hierfür OpenOffice (LibreOffice) verwenden.
soffice --convert-to jpg "Textfile.doc"
es funktioniert auch mit Textdateien.
Antwort4
Eine einfache Lösung besteht in der Verwendung pango-view
vonPango, eine in GTK verwendete Textdarstellungsbibliothek, die Sie wahrscheinlich bereits installiert haben:
pango-view --font=mono -qo image.png file
Sie können erstellenSVG-Dateienzu!
pango-view --font=mono -qo image.svg file
pango-view
verfügt über zahlreiche Anpassungs- und Layoutoptionen, siehe die Manpage.