Cómo transformar un archivo de texto en una imagen

17

Si tengo un archivo de texto sin formato, ¿cómo puedo convertirlo en un archivo de imagen a través de la línea de comando? (y preservar el diseño del arte ASCII en él)

Quora Feans
fuente
Comenzaría a buscar una forma automática de renderizar texto con una fuente monoespacial (gimp o LaTeX podría ser el camino a seguir)
RSFalcon7
Esta es una solución fea, pero ¿por qué no solo caty tomar una captura de pantalla?
psimon
Eso sería demasiado feo, y una captura de pantalla incluiría información adicional, como el aviso.
Quora Feans
Si tan sólo el símbolo es el problema, intente lo siguiente: clear && cat file. Pero sí, es feo.
psimon
no, eso todavía mostraría mi nombre de usuario ... Y a menos que encuentre una manera de hacer una captura de pantalla a través de la línea de comando, no será aceptable.
Quora Feans

Respuestas:

8

Puede usar openoffice (libreoffice) para hacerlo.

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

Funciona también con archivos de texto.

Almirante Smith
fuente
Eso ... es asombroso! No tenía idea de que OpenOffice pudiera convertir a JPG ... o PNG, que acabo de probar; probablemente otros formatos también. (No ayuda que no se mencione ni siquiera se sugiera esto en la --helpsalida). Solo arrugas, si el texto es más largo que una página, parece que solo obtienes la primera página. (Si hay una manera de decirle que envíe otras páginas o múltiples archivos, no es obvio para mí de inmediato. Pasar --outdirno hace ninguna diferencia). Pero para fragmentos cortos de texto, funciona EXTREMADAMENTE bien, e incluso se ajusta automáticamente. ¡Agradable!
FeRD
Esto produce una página de tamaño fijo con texto potencialmente pequeño si el texto es pequeño.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 Página de tamaño fijo, cierto, pero ahí es donde el recorte automático de ImageMagick es útil nuevamente:soffice --convert-to jpg ascii.txt && mogrify -trim -bordercolor "#FFF" -border 10 +repage ascii.jpg
FeRD
26

imagemagickes tu amigo aquí Algo similar a lo siguiente puede ayudarlo: -

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

¿Dónde ascii.txtestá tu archivo 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:::::::::' 
        `':::_:' -- '' -'-' `':_::::'`  
    "

con text 15,15 agregado como la primera línea de texto (el 15,15 es un desplazamiento posicional). Además, asegúrese de que el texto real a convertir esté entre comillas. Las comillas simples o dobles servirán, pero asegúrese de que no se usen como parte de su arte ascii, ya que confundirá las cosas.

La fuente que elija debe ser monoespaciada; de lo contrario, el texto no se alineará.

Esto produce: -

ingrese la descripción de la imagen aquí

garethTheRed
fuente
¿Tiene alguna pista sobre cómo obtener una lista de nombres de fuente válidos? Si bien Free Mono parece estar instalado en mi sistema, imagemagick no lo reconoce.
Raphael
1
@Raphael: puede obtener una lista de las fuentes disponibles actualmente de cualquier comando de ImageMagick (incluida la conversión) utilizando la -listopción. Entonces, por ejemplo, convert -list fontle mostraría todos los argumentos posibles para -font.
FeRD
También puede instalar este programa usando sudo yum install ImageMagick.
rangsiman
@ R.Ketkaew Ese comando es válido para alguien que ejecuta Fedora 21 o inferior, o algunas revisiones de RHEL (ni siquiera estoy seguro si el último todavía está usando yum). En Fedora 22+, el comando de instalación es sudo dnf install ImageMagick, y en la mayoría de las otras distribuciones populares de Linux será algún sudo apt-get install ...comando. En cualquier caso, la información anterior supone que ImageMagick está instalado en el sistema en cuestión.
FeRD
18

Considero que el -annotateoperador de ImageMagick es un poco más conveniente que el -drawmétodo garethTheRed sugerido, por la sencilla razón de que no requiere modificación del archivo de entrada. No es tan poderoso como -draw, pero para el volcado total de los contenidos de un archivo de texto en una imagen, sirve muy bien.

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

generará una versión renderizada del contenido del archivo dado, pero sin tener que modificar su archivo "ascii.txt" para contener la text 15x15parte de-draw primitiva.

Especificación de argumentos

El argumento -fontpuede ser cualquier nombre de fuente compatible, si FreeMono no está disponible (o simplemente no se desea). Se puede obtener una lista de las fuentes disponibles para cualquier comando de ImageMagick utilizando el -listoperador, por convert -list fontlo que mostrará todos los argumentos posibles para -font.

Los argumentos para -annotate(hasta qué punto desplazar el texto representado desde el borde del lienzo) consisten en desplazamientos de píxeles horizontales y verticales (respectivamente). El primer desplazamiento (desplazamiento horizontal x) puede ser cualquier número entero positivo, pero no necesita ser mayor que unos pocos píxeles. El segundo desplazamiento (desplazamiento vertical y) debe ser al menos igual al tamaño de punto de la fuente elegida (el argumento para -pointsize), porque ImageMagick colocará la línea de base de la fuente en el desplazamiento dado. Entonces, si no desplaza la fuente hacia abajo al menos pointsizepíxeles, la parte superior de la primera línea se cortará.

Recomiendo ir al menos varios píxeles, por lo que si está utilizando -pointsize 64, debe emparejar eso con algo así -annotate +15+80. (No hay razón para aumentar el desplazamiento horizontal con tamaños de fuente más grandes, no tiene relación con las dimensiones del texto).

La necesidad de adivinar las dimensiones necesarias de la imagen de salida también puede ser tediosa. Por lo general, solo elijo valores excesivos, luego aprovecho los de ImageMagick -trimy -borderpara recortar automáticamente el resultado. El siguiente comando:

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

se renderizará en un cuadro de 1000x2000, luego recortará el exceso de espacio en blanco a excepción de un borde de 10 píxeles alrededor del texto. Al +repagefinal evita que el PNG de salida se cree con un desplazamiento de imagen, lo que de otro modo haría que GIMP muestre un cuadro de diálogo sobre la carga preguntando si debe aplicar el desplazamiento.

(Obviamente, 1000x2000 es excesivo para archivos de texto pequeños, y para archivos más largos, al menos la dimensión vertical puede necesitar ser aumentada. Sin embargo, es más simple sobreestimar, ya que el único costo es convertconsumir un poco más de CPU y memoria durante el procesamiento).

Entrada de preprocesamiento

Si su archivo de texto no está formateado de la manera que necesita para renderizarlo (por ejemplo, si usa líneas muy largas), es posible que tenga que volver a formatearlo antes de entregárselo convert. ImageMagick no ajustará el texto, por lo que cada línea de texto se extenderá horizontalmente en toda su longitud. Afortunadamente, es posible ejecutar el archivo a través de cualquier formateador de línea de comandos que desee, luego canalizar el texto procesado en convertlugar de leerlo directamente desde el archivo:

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

Eso representará el contenido de ascii.txtDejaVu Sans Condensed de 24 puntos, después de que haya sido procesado por el fmtcomando, que en su modo de operación predeterminado reformateará su entrada mediante el ajuste de palabras a un ancho de 75 columnas. (A menos que haya cadenas largas y continuas de más de 75 caracteres, como las URL, en cuyo caso se extenderán).

Una vez que fmtha reformateado el texto, se convertpasará a él y luego se generará la fmtsalida canalizada , como si estuviera leyendo el archivo directamente. (Especificar un nombre de archivo de -es una abreviatura de shell de UNIX bastante común para "leer desde la entrada estándar, en lugar de cualquier archivo de disco con nombre", y las herramientas de ImageMagick siguen esa convención).

FeRD
fuente
1
El componente y del annotateargumento debe ser mayor que el tamaño del punto para asegurarse de que todo aparezca: convert -size 1000x2000 xc:white -font "FreeMono" -pointsize 123 -fill black \ -annotate +0+123 "@ascii.txt" -trim -bordercolor "#FFF" -border 10 +repage image.pngdónde 123está el tamaño deseado. Además, puede usar convert -list fontpara averiguar qué fuentes son compatibles ( "FreeMono"no es universalmente compatible).
Alec Jacobson
1
Corrección: convert -list fontes la sintaxis correcta, no convert -list fonts.
Sopalajo de Arrierez
1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 Hmm, buena pregunta. Mi instalación de IM7 no tiene ninguna política establecida /etc/ImageMagick-7/policy.txtque interfiera con ninguno de estos formularios de conversión. ¿Sabes qué política está bloqueando la conversión y por qué está configurada? (También, agarrando a un clavo ardiendo: ¿El hilo fmt ...forma de la obra de comandos, por casualidad Si es así, usted podría reemplazar? fmtA cat, y obtener el mismo resultado que la @ascii.txtversión.)
Ferd
1
@CiroSantilli 新疆 改造 中心 法轮功 六四 事件 Oh, una pregunta más: especificó "falló ... con el esmoquin sin los metadatos feos". ¿ Eso significa que convert tiene éxito cuando utiliza el -drawformulario @ garethTheRed e inserta los comandos de posicionamiento en el ascii.txtarchivo? Sería bastante extraño si ese fuera el caso, me parece a mí, ya que tengo problemas para imaginar qué problemas de seguridad habría con -annotateeso que no se aplicarían -draw, cuando trabaje fuera del contenido de un archivo de texto importado.
FeRD
1
Ni siquiera había intentado la respuesta de Gareth debido a los feos metadatos, pero eso funcionó ahora. Mi /etc/ImageMagick-6/policy.xmlcontiene, <policy domain="path" rights="none" pattern="@*"/>así que supongo que ese es el. stdin tampoco funciona, presumiblemente porque también tiene el @-patrón. Para los desesperados, "$(cat ascii.txt)"funciona si no explota la longitud de la CLI.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件