Como transformar um arquivo de texto em uma imagem

13

Se eu tiver um arquivo de texto simples, como posso convertê-lo em um arquivo de imagem por meio da linha de comando? (e preservar o layout da arte ASCII nele)

    
por Quora Feans 23.06.2014 / 21:03

3 respostas

5

Você poderia usar o openoffice (libreoffice) para fazer isso.

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

também funciona com arquivos de texto.

    
por 28.06.2017 / 18:41
24

imagemagick é seu amigo aqui. Algo semelhante ao seguinte pode ajudá-lo: -

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

onde ascii.txt é o seu arquivo 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:::::::::' 
        '':::_:' -- '' -'-' '':_::::''  
    "

com text 15,15 adicionado como primeira linha de texto (o 15,15 é um deslocamento posicional). Além disso, certifique-se de que o texto real a ser convertido esteja entre aspas. Aspas simples ou duplas servirão, mas certifique-se de que elas não sejam usadas como parte de sua arte, pois isso confundirá as coisas.

A fonte escolhida deve ser uma fonte monoespaçada, caso contrário, o texto não será alinhado.

Isso produz: -

    
por 23.06.2014 / 21:25
13

Acho que o operador -annotate do ImageMagick é um pouco mais conveniente do que o método -draw garethTheRed sugeriu, pela simples razão de que não requer modificação do arquivo de entrada. Não é tão poderoso quanto -draw , mas para o despejo por atacado do conteúdo de um arquivo de texto em uma imagem, ele serve muito bem.

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

produzirá uma versão renderizada do conteúdo do arquivo, mas sem ter que modificar o arquivo "ascii.txt" para conter a parte text 15x15 da% primitiva-draw.

Especificando Argumentos

O argumento para -font pode ser qualquer nome de fonte suportado, se o FreeMono não estiver disponível (ou simplesmente não for desejado). Uma lista das fontes disponíveis para qualquer comando do ImageMagick pode ser obtida usando o operador -list , portanto, convert -list fonts exibirá todos os possíveis argumentos para -font .

Os argumentos para -annotate (até onde mudar o texto renderizado da borda da tela) consistem em deslocamentos de pixel horizontal e vertical (respectivamente). O primeiro deslocamento (deslocamento x horizontal) pode ser qualquer número inteiro positivo, mas não precisa ser maior que alguns pixels. O segundo deslocamento (y-shift vertical) deve ser pelo menos igual ao tamanho em pontos da fonte escolhida (o argumento para -pointsize ), porque o ImageMagick colocará o linha de base da fonte no deslocamento especificado. Então, se você não deslocar a fonte pelo menos pointsize pixels, o topo da primeira linha será cortado.

Recomendo pelo menos vários pixels, por isso, se você estiver usando -pointsize 64 , deverá emparelhar com algo como -annotate +15+80 . (Não há razão para aumentar o deslocamento horizontal com tamanhos de fonte maiores, não tem relação com as dimensões do texto.)

Precisando adivinhar as dimensões necessárias da imagem de saída também pode ser entediante. Eu costumo escolher valores excessivos, então aproveite -trim e -border do ImageMagick para autocrop o resultado. O seguinte 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

será renderizado em uma caixa de 1000 x 2000 e, em seguida, reduzirá o excesso de espaço em branco, com exceção de uma borda de 10 pixels em todo o texto. O +repage no final impede que o PNG de saída seja criado com um deslocamento de imagem, o que, de outra forma, faria com que o GIMP exibisse um diálogo no carregamento perguntando se ele deveria aplicar o deslocamento.

(Obviamente, 1000x2000 é excessivo para pequenos arquivos de texto, e para os mais longos pelo menos a dimensão vertical pode precisar ser aumentada. É mais simples superestimar, pois o único custo é convert consumindo um pouco mais de CPU e memória durante o processamento.)

Entrada de pré-processamento

Se o seu arquivo de texto ainda não estiver formatado da maneira que você precisa para renderizá-lo (digamos, se ele usar linhas muito longas), talvez seja necessário reformatá-lo antes de entregá-lo a convert . O ImageMagick não encapsula o texto, de modo que cada linha de texto será ampliada horizontalmente. Felizmente, é possível executar o arquivo por meio de qualquer formatador de linha de comando desejado e, em seguida, enviar o texto processado para convert em vez de ler diretamente do arquivo:

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

Isso renderiza o conteúdo de ascii.txt em DejaVu Sans Condensed de 24 pontos, após ele foi processado pelo comando fmt , que em seu modo padrão de operação reformatará sua entrada por quebra de linha para uma largura de 75 colunas. (A menos que existam sequências longas e contínuas com mais de 75 caracteres, como URLs, caso em que elas se estenderão.)

Quando fmt tiver reformatado o texto, ele será passado para convert , que renderizará a saída defmt canalizada, como se estivesse lendo o arquivo diretamente. (Especificar um nome de arquivo de - é uma abreviação de shell UNIX bastante comum para "leitura da entrada padrão, em vez de qualquer arquivo de disco nomeado", e as ferramentas do ImageMagick seguem essa convenção.)

    
por 14.12.2015 / 20:23