So wandeln Sie eine Textdatei in ein Bild um


17

Wie kann ich eine reine Textdatei über die Befehlszeile in eine Bilddatei konvertieren? (und behalten Sie das Layout der ASCII-Grafik bei)


Ich würde nach einer automatischen Methode suchen, um Text mit einer Monospace-Schriftart zu rendern (Gimp oder LaTeX könnten der
richtige

Dies ist eine hässliche Lösung, aber warum nicht einfach cateinen Screenshot machen?
Psimon

Das wäre zu hässlich und ein Screenshot würde zusätzliche Informationen wie die Eingabeaufforderung enthalten.
Quora Feans

Wenn nur die Eingabeaufforderung das Problem ist, versuchen Sie dies: clear && cat file. Aber ja, es ist hässlich.
Psimon

Nein, das würde immer noch meinen Benutzernamen anzeigen ... Und wenn ich keinen Weg finde, einen Screenshot über die Befehlszeile zu machen, ist dies nicht akzeptabel.
Quora Feans

Antworten:


8

Sie können dafür openoffice (libreoffice) verwenden.

soffice --convert-to jpg "Textfile.doc"

Es funktioniert auch mit Textdateien.


Das ist genial! Ich hatte keine Ahnung, dass OpenOffice in JPG oder PNG konvertieren kann, was ich gerade ausprobiert habe. wahrscheinlich auch andere Formate. (Hilft nicht, dass dies in der --helpAusgabe nicht erwähnt oder sogar angedeutet wird.) Nur Faltenbildung: Wenn der Text länger als eine Seite ist, wird anscheinend nur die erste Seite angezeigt. (Wenn es eine Möglichkeit gibt, andere Seiten oder mehrere Dateien auszugeben, ist das für mich nicht sofort ersichtlich. Übergeben --outdirmacht keinen Unterschied.) Aber für kurze Textabschnitte funktioniert es EXTREM gut und sogar automatisch umbrochen. Nett!
Ferd

Dies erzeugt eine Seite mit fester Größe und möglicherweise winzigem Text, wenn der Text klein ist.
Ciro Santilli新疆改造中心法轮功六四事件

1
@CiroSantilli 新疆 新疆 改造 中心 法轮功 六四 Seite mit fester Größe, stimmt, aber hier ist das automatische Zuschneiden von ImageMagick wieder nützlich:soffice --convert-to jpg ascii.txt && mogrify -trim -bordercolor "#FFF" -border 10 +repage ascii.jpg
FERD

26

imagemagickist dein Freund hier. Etwas Ähnliches wie das Folgende kann Ihnen helfen:

convert -size 360x360 xc:white -font "FreeMono" -pointsize 12 -fill black -draw @ascii.txt image.png

wo ascii.txtist deine 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:::::::::' 
        `':::_:' -- '' -'-' `':_::::'`  
    "

wird text 15,15als erste Textzeile hinzugefügt (15,15 ist ein Positionsoffset). Stellen Sie außerdem sicher, dass der zu konvertierende Text in Anführungszeichen steht. Einfache oder doppelte Anführungszeichen reichen aus, aber stellen Sie sicher, dass sie nicht als Teil Ihrer ASCII-Kunst verwendet werden, da dies die Sache verwirren wird.

Die Schriftart, die Sie auswählen, sollte einfarbig sein, da der Text sonst nicht ausgerichtet werden kann.

Dies erzeugt:

Bildbeschreibung hier eingeben


Haben Sie einen Tipp, wie Sie eine Liste gültiger Schriftnamen erhalten? Während Free Mono auf meinem System installiert zu sein scheint, erkennt imagemagick es nicht.
Raphael

1
@Raphael: Mit dieser -listOption können Sie von jedem ImageMagick-Befehl (einschließlich Konvertieren) eine Liste der derzeit verfügbaren Schriftarten abrufen . Also convert -list fontwürde dir zB alle möglichen Argumente dazu zeigen -font.
Ferd

Sie können dieses Programm auch mithilfe von installieren sudo yum install ImageMagick.
Rangsiman

@ R.Ketkaew Dieser Befehl ist für Benutzer mit Fedora 21 oder niedriger oder für einige Versionen von RHEL gültig (nicht einmal sicher, ob die neueste Version noch yum verwendet). Auf Fedora 22+ lautet der Installationsbefehl sudo dnf install ImageMagickund auf den meisten anderen gängigen Linux-Distributionen wird er ein sudo apt-get install ...Befehl sein. Unabhängig davon wird in den obigen Informationen davon ausgegangen, dass ImageMagick auf dem betreffenden System installiert ist.
FeRD

18

Ich finde den -annotateOperator von ImageMagick etwas praktischer als die von -drawgarethTheRed vorgeschlagene Methode, da die Eingabedatei nicht geändert werden muss. Es ist nicht so leistungsfähig wie -draw, aber für das Großhandels-Dumping des Inhalts einer Textdatei in ein Bild ist es in Ordnung.

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 jedoch die Datei "ascii.txt" so zu ändern, dass sie den text 15x15Teil des Grundelements enthält -draw.

Argumente angeben

Das Argument für -fontkann ein beliebiger unterstützter Schriftartname sein, wenn FreeMono nicht verfügbar ist (oder einfach nicht gewünscht ist). Mit dem -listOperator kann eine Liste der für jeden ImageMagick-Befehl verfügbaren Schriftarten abgerufen werden , sodass convert -list fontalle möglichen Argumente für angezeigt werden -font.

Die Argumente für -annotate(wie weit der gerenderte Text vom Rand der Zeichenfläche verschoben werden soll) bestehen aus horizontalen bzw. vertikalen Pixelversätzen. Der erste Versatz (horizontale x-Verschiebung) kann eine beliebige positive ganze Zahl sein, muss jedoch nicht größer als einige Pixel sein. Die zweite Versatz (vertikale y-Verschiebung) muss sein , zumindest bis zu dem Punkt Größe der Schriftart ausgewählt (das Argument zu entsprechen -pointsize), da ImageMagick wird die Ort Grundlinie der Schriftart bei der Offset angegeben. Wenn Sie also die Schrift nicht mindestens um pointsizePixel nach unten verschieben , wird der obere Rand der ersten Zeile abgeschnitten.

Ich empfehle, mindestens einige Pixel darüber zu gehen. Wenn Sie -pointsize 64also etwas verwenden , sollten Sie dies mit etwas wie koppeln -annotate +15+80. (Es gibt keinen Grund, den horizontalen Versatz bei größeren Schriftgrößen zu erhöhen. Er hat keine Beziehung zu den Textabmessungen.)

Das Erraten der erforderlichen Abmessungen des Ausgabebildes kann ebenfalls mühsam sein. Normalerweise wähle ich nur übermäßige Werte aus, nutze dann die von ImageMagick -trimund -borderschneide das Ergebnis automatisch zu. 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 eine 1000x2000-Box gerendert und der überschüssige weiße Bereich mit Ausnahme eines 10-Pixel-Rahmens um den gesamten Text abgeschnitten. Der +repageam Ende verhindert wird der Ausgang PNG mit einem Bildversatz, erstellt die sonst Ursache GIMP einen Dialog auf Last Pop - up zu fragen , ob es den Offset gelten sollte.

(Offensichtlich ist 1000x2000 für kleine Textdateien zu groß, und für längere muss möglicherweise zumindest die vertikale Dimension vergrößert werden. Es ist jedoch einfacher, sie zu überschätzen, da die einzigen Kosten convertetwas mehr CPU und Speicher während der Verarbeitung erfordern .)

Vorverarbeitungseingabe

Wenn Ihre Textdatei noch nicht so formatiert ist, wie Sie es zum Rendern benötigen (z. B. wenn sie sehr lange Zeilen verwendet), müssen Sie sie möglicherweise neu formatieren, bevor Sie sie übergeben convert. ImageMagick umschließt den Text nicht, sodass jede Textzeile horizontal in voller Länge angezeigt wird. Glücklicherweise ist es möglich, die Datei über beliebige Befehlszeilenformatierer auszuführen und dann den verarbeiteten Text zu leiten, 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

Damit wird der Inhalt von ascii.txtDejaVu Sans Condensed mit 24 Punkten gerendert, nachdem er vom fmtBefehl verarbeitet wurde , der in seiner Standardbetriebsart seine Eingabe durch Zeilenumbruch auf eine Breite von 75 Spalten umformatiert. (Es sei denn, es gibt lange fortlaufende Zeichenfolgen, die länger als 75 Zeichen sind, wie z. B. URLs. In diesem Fall erstrecken sie sich über mehrere Zeichen.)

Nachdem fmtder Text neu formatiert wurde, wird er an übergeben, und convertdie weitergeleitete fmtAusgabe wird so wiedergegeben, als würde die Datei direkt gelesen. (Die Angabe eines Dateinamens von -ist eine häufig verwendete Abkürzung der UNIX-Shell für "Lesen von der Standardeingabe anstelle einer benannten Festplattendatei". Die Tools von ImageMagick folgen dieser Konvention.)


1
Die y-Komponente des annotateArguments sollte größer als die Punktgröße sein, um sicherzustellen, dass alles angezeigt wird: convert -size 1000x2000 xc:white -font "FreeMono" -pointsize 123 -fill black \ -annotate +0+123 "@ascii.txt" -trim -bordercolor "#FFF" -border 10 +repage image.pngWo 123ist die gewünschte Größe ? Sie können auch convert -list fontfeststellen, welche Schriftarten unterstützt werden ( "FreeMono"wird nicht allgemein unterstützt).
Alec Jacobson

1
Korrektur: convert -list fontist die richtige Syntax, nicht convert -list fonts.
Sopalajo de Arrierez

1
@CiroSantilli Hmm, gute Frage. In meiner IM7-Installation sind keine Richtlinien festgelegt /etc/ImageMagick-7/policy.txt, die diese Konvertierungsformulare beeinträchtigen. Wissen Sie, welche Richtlinie die Konvertierung blockiert und warum sie festgelegt wurde? (Auch bei Strohhalm greifen: Hat die verrohrt fmt ...Form der Befehl Arbeit, durch Zufall Wenn ja, könnten Sie einfach ersetzen? fmtMit cat, und das gleiche Ergebnis wie die bekommen @ascii.txtVersion.)
Ferd

1
@CiroSantilli 新疆 新疆 改造 中心 法轮功 六四 Oh, noch eine Frage: Sie haben "fehlgeschlagen ... mit dem Smoking ohne die hässlichen Metadaten" angegeben. Bedeutet das, dass dies convert erfolgreich ist, wenn Sie das @ garethTheRed- -drawFormular verwenden und die Positionierungsbefehle in die ascii.txtDatei einfügen ? Es wäre schön zu sein bizarr , wenn das der Fall ist, scheint mir, da ich Probleme Vorstellen, die mich , was Sicherheitsbedenken es mit würde -annotatedas wäre nicht auch anzuwenden -draw, wenn aus dem Inhalt einer importierten Textdatei arbeiten.
FeRD

1
Ich hatte Gareths Antwort wegen der hässlichen Metadaten nicht einmal ausprobiert, aber das funktionierte jetzt. Mein /etc/ImageMagick-6/policy.xmlInhalt, <policy domain="path" rights="none" pattern="@*"/>also denke ich, das ist der eine. stdin funktioniert auch nicht, vermutlich weil es auch das @-Muster enthält. Funktioniert für die Verzweifelten, "$(cat ascii.txt)"wenn es die CLI-Länge nicht sprengt.
Ciro Santilli新疆改造中心法轮功六四事件
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.