So wandeln Sie eine Textdatei in ein Bild um

So wandeln Sie eine Textdatei in ein Bild um

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

imagemagickist 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.txtist 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,15als 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:

Bildbeschreibung hier eingeben

Antwort2

Ich finde den Operator von ImageMagick -annotateetwas praktischer als die von -drawgarethTheRed 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 15x15Teil des -drawPrimitivs enthält.

Angeben von Argumenten

Das Argument für -fontkann 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 -listOperator abgerufen werden, daher convert -list fontwerden 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 pointsizePixel nach unten verschieben, wird die Oberseite der ersten Zeile abgeschnitten.

Ich empfehle, mindestens mehrere Pixel darüber hinauszugehen. Wenn Sie also -pointsize 64dann 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 -trimund -borderum 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 +repageganz 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 convertwä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, convertanstatt 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.txtin 24-Punkt-DejaVu Sans Condensed gerendert.naches wurde vom fmtBefehl 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 fmtder Text neu formatiert wurde, wird er an übergeben, convertdas 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-viewvonPango, 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-viewverfügt über zahlreiche Anpassungs- und Layoutoptionen, siehe die Manpage.

verwandte Informationen