Comment transformer un fichier texte en image

17

Si j'ai un fichier texte brut, comment puis-je le convertir en fichier image via la ligne de commande? (et y conserver la disposition de l'art ASCII)

Quora Feans
la source
Je commencerais à chercher un moyen automatique de rendre le texte avec une police monospace (gimp ou LaTeX pourrait être le chemin à parcourir)
RSFalcon7
C'est une solution laide, mais pourquoi ne pas simplement la catprendre et prendre une capture d'écran?
psimon
Ce serait trop moche, et une capture d'écran comprendrait des informations supplémentaires, comme l'invite.
Quora Feans
Si seulement l'invite est le problème, essayez ceci: clear && cat file. Mais oui, c'est moche.
psimon
non, cela afficherait toujours mon nom d'utilisateur ... Et à moins que je ne trouve un moyen de faire une capture d'écran via la ligne de commande, ce ne sera pas acceptable.
Quora Feans

Réponses:

8

Vous pouvez utiliser openoffice (libreoffice) pour le faire.

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

cela fonctionne aussi avec les fichiers texte.

Amiral Smith
la source
C'est génial! Je ne savais pas qu'OpenOffice pouvait convertir en JPG ... ou PNG, que je viens d'essayer; probablement d'autres formats également. (Cela n'aide pas qu'il n'y ait aucune mention ou même un indice de cela dans la --helpsortie.) Seulement des rides, si le texte est plus long qu'une page, il semble que vous n'obteniez que la première page. (S'il y a un moyen de lui dire de sortir d'autres pages ou plusieurs fichiers, ce n'est pas immédiatement évident pour moi. Passer --outdirne fait aucune différence.) Mais pour les petits morceaux de texte, cela fonctionne EXTRÊMEMENT bien, et même les retours automatiques. Agréable!
FeRD
Cela produit une page de taille fixe avec du texte potentiellement minuscule si le texte est petit.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
1
@CiroSantilli page 改造 中心 法轮功 六四 事件 Page de taille fixe, c'est vrai, mais c'est là que le recadrage automatique d'ImageMagick est à nouveau utile:soffice --convert-to jpg ascii.txt && mogrify -trim -bordercolor "#FFF" -border 10 +repage ascii.jpg
FeRD
26

imagemagickest ton ami ici. Quelque chose de semblable au suivant peut vous aider: -

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

ascii.txtest votre fichier ascii-art: -

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:::::::::' 
        `':::_:' -- '' -'-' `':_::::'`  
    "

avec text 15,15 ajouté comme première ligne de texte (le 15,15 est un décalage de position). Assurez-vous également que le texte à convertir est placé entre guillemets. Les guillemets simples ou doubles suffiront, mais assurez-vous qu'ils ne sont pas utilisés dans le cadre de votre ascii-art car cela perturbera les choses.

La police que vous choisissez doit être une police à espacement fixe, sinon le texte ne s'alignera pas.

Cela produit: -

entrez la description de l'image ici

garethTheRed
la source
Avez-vous un indice sur la façon d'obtenir une liste de noms de police valides? Bien que Free Mono semble être installé sur mon système, imagemagick ne le reconnaît pas.
Raphael
1
@Raphael: Vous pouvez obtenir une liste des polices actuellement disponibles à partir de n'importe quelle commande ImageMagick (y compris convertir) en utilisant l' -listoption. Donc, par exemple convert -list font, vous montrerait tous les arguments possibles pour -font.
FeRD
Vous pouvez également installer ce programme en utilisant sudo yum install ImageMagick.
rangsiman
@ R.Ketkaew Cette commande est valide pour quelqu'un qui exécute Fedora 21 ou une version antérieure, ou pour certaines révisions de RHEL (je ne sais même pas si la dernière utilise toujours yum). Sur Fedora 22+, la commande d'installation est sudo dnf install ImageMagick, et sur la plupart des autres distributions Linux populaires, ce sera une sudo apt-get install ...commande. Quoi qu'il en soit, les informations ci-dessus supposent en effet qu'ImageMagick est installé sur le système en question.
FeRD
18

Je trouve que l' -annotateopérateur d' ImageMagick est un peu plus pratique que la -drawméthode suggérée par garethTheRed, pour la simple raison qu'il ne nécessite pas de modification du fichier d'entrée. Ce n'est pas aussi puissant que -draw, mais pour le dumping en gros du contenu d'un fichier texte dans une image, il sert très bien.

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

affichera une version rendue du contenu du fichier donné, mais sans avoir à modifier votre fichier "ascii.txt" pour contenir la text 15x15partie de la -drawprimitive.

Spécification des arguments

L'argument to -fontpeut être n'importe quel nom de police pris en charge, si FreeMono n'est pas disponible (ou n'est tout simplement pas souhaité). Une liste des polices disponibles pour toute commande ImageMagick peut être obtenue à l'aide de l' -listopérateur, donc convert -list fontaffichera tous les arguments possibles pour -font.

Les arguments pour -annotate(jusqu'où déplacer le texte rendu du bord du canevas) consistent en des décalages de pixels horizontaux et verticaux (respectivement). Le premier décalage (décalage horizontal x) peut être n'importe quel entier positif, mais ne doit pas être supérieur à quelques pixels. Le deuxième décalage (décalage vertical y) doit être au moins égal à la taille en points de la police choisie (l'argument à -pointsize), car ImageMagick placera la ligne de base de la police au décalage donné. Donc, si vous ne diminuez pas la police d'au moins pointsizepixels, le haut de la première ligne sera coupé.

Je recommande de dépasser de plusieurs pixels au moins, donc si vous utilisez, -pointsize 64vous devez associer cela à quelque chose comme -annotate +15+80. (Il n'y a aucune raison d'augmenter le décalage horizontal avec des tailles de police plus grandes, il n'a aucun rapport avec les dimensions du texte.)

Devoir deviner les dimensions nécessaires de l'image de sortie peut également être fastidieux. Je choisis généralement des valeurs excessives, puis profite d'ImageMagick -trimet -borderde recadrer automatiquement le résultat. La commande suivante:

convert -size 1000x2000 xc:white -font "FreeMono" -pointsize 12 -fill black \
-annotate +15+15 "@ascii.txt" -trim -bordercolor "#FFF" -border 10 +repage image.png

s'affichera dans une zone de 1 000 x 2 000, puis coupera l'espace blanc en excès, à l'exception d'une bordure de 10 pixels tout autour du texte. Le tout +repageà la fin empêche la création du PNG de sortie avec un décalage d'image, ce qui entraînerait sinon GIMP à ouvrir une boîte de dialogue lors du chargement lui demandant s'il doit appliquer le décalage.

(Évidemment, 1000x2000 est excessif pour les petits fichiers texte, et pour les plus longs, au moins la dimension verticale doit être augmentée. Cependant, il est plus simple de surestimer, car le seul coût convertconsomme un peu plus de CPU et de mémoire lors du traitement.)

Entrée de prétraitement

Si votre fichier texte n'est pas déjà formaté comme vous le souhaitez pour le rendre (par exemple, s'il utilise de très longues lignes), vous devrez peut-être le reformater avant de le remettre convert. ImageMagick n'encapsulera pas le texte, donc chaque ligne de texte s'étendra sur toute sa longueur horizontalement. Heureusement, il est possible d'exécuter le fichier via n'importe quel formateur de ligne de commande que vous souhaitez, puis de diriger le texte traité au convertlieu de le lire directement à partir du fichier:

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

Cela rendra le contenu de ascii.txt DejaVu Sans Condensed en 24 points, après avoir été traité par la fmtcommande, qui, dans son mode de fonctionnement par défaut, reformatera son entrée par habillage de mots sur une largeur de 75 colonnes. (Sauf s'il existe de longues chaînes continues de plus de 75 caractères, comme les URL, auquel cas elles s'étendent.)

Une fois fmtle texte reformaté, il sera transmis à convertqui rendra ensuite la fmtsortie canalisée , comme s'il lisait directement le fichier. (La spécification d'un nom de fichier -est un raccourci de shell UNIX assez courant pour "lire à partir de l'entrée standard, au lieu de n'importe quel fichier de disque nommé", et les outils ImageMagick suivent cette convention.)

FeRD
la source
1
La composante y de l' annotateargument doit être plus grande que la taille des points pour être sûr que tout apparaît: convert -size 1000x2000 xc:white -font "FreeMono" -pointsize 123 -fill black \ -annotate +0+123 "@ascii.txt" -trim -bordercolor "#FFF" -border 10 +repage image.png123est la taille souhaitée. En outre, vous pouvez utiliser convert -list fontpour savoir quelles polices sont prises en charge ( "FreeMono"n'est pas universellement pris en charge).
Alec Jacobson
1
Correction: convert -list fontla syntaxe est-elle correcte, non convert -list fonts.
Sopalajo de Arrierez
1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 Hmm, bonne question. Mon installation IM7 n'a aucune politique définie /etc/ImageMagick-7/policy.txtqui interfère avec l'un de ces formulaires de conversion. Savez-vous quelle stratégie bloque la conversion et pourquoi elle est définie? (Aussi, saisir les pailles: la fmt ...forme canalisée de la commande fonctionne-t-elle, par hasard? Si oui, vous pouvez simplement la remplacer fmtpar cat, et obtenir le même résultat que la @ascii.txtversion.)
FeRD
1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 Oh, encore une question: vous avez spécifié "échoué ... avec le tux sans les vilaines métadonnées". Est-ce à dire que cela convert réussit lorsque vous utilisez le -drawformulaire de @ garethTheRed et insérez les commandes de positionnement dans le ascii.txtfichier? Ce serait assez bizarre si tel est le cas, me semble-t-il, car j'ai du mal à imaginer les problèmes de sécurité -annotatequi ne s'appliqueraient pas également -drawlorsque je travaille sur le contenu d'un fichier texte importé.
FeRD
1
Je n'avais même pas essayé la réponse de Gareth à cause des vilaines métadonnées, mais cela fonctionnait maintenant. Mon /etc/ImageMagick-6/policy.xmlcontient <policy domain="path" rights="none" pattern="@*"/>donc je suppose que c'est celui-là. stdin ne fonctionne pas non plus, probablement parce qu'il contient également le @-motif. Pour les désespérés, "$(cat ascii.txt)"fonctionne s'il ne fait pas exploser la longueur de la CLI.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件