Como transformar um arquivo de texto em uma imagem

17

Se eu tiver um arquivo de texto sem formatação, como posso convertê-lo em um arquivo de imagem através da linha de comando? (e preservar o layout da arte ASCII)

Quora Feans
fonte
Gostaria de começar a procurar uma maneira automática para processar texto com uma fonte monoespaçada (GIMP ou LaTeX pode ser o caminho a percorrer)
RSFalcon7
Esta é uma solução feia, mas por que não fazer catisso e tirar uma captura de tela?
Psimon 23/06/14
Isso seria muito feio e uma captura de tela incluiria informações adicionais, como o prompt.
Quora Feans
Se apenas o prompt é o problema, tente o seguinte: clear && cat file. Mas sim, é feio.
Psimon
não, isso ainda mostraria meu nome de usuário ... E, a menos que eu encontre uma maneira de fazer uma captura de tela pela linha de comando, não será aceitável.
Quora Feans

Respostas:

8

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

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

Também funciona com arquivos de texto.

Almirante Smith
fonte
Isso é incrível! Eu não tinha ideia de que o OpenOffice pudesse converter para JPG ... ou PNG, que acabei de tentar; provavelmente outros formatos também. (Não ajuda que não exista menção ou até mesmo sugestão disso na --helpsaída.) Apenas amassar, se o texto for maior que uma página, parece que você só obtém a primeira página. (Se existe uma maneira de dizer a ele para imprimir outras páginas ou vários arquivos, isso não é imediatamente óbvio para mim. Passar --outdirnão faz diferença.) Mas, para pequenos pedaços de texto, ele funciona EXTREMAMENTE bem, e até quebra automática. Agradável!
Ferd
Isso produz uma página de tamanho fixo com texto potencialmente minúsculo, se o texto for pequeno.
Ciro Santilli escreveu: 10/10/19
1
Página de tamanho fixo, é verdade, mas é aí que o recorte automático do ImageMagick se torna útil novamente:soffice --convert-to jpg ascii.txt && mogrify -trim -bordercolor "#FFF" -border 10 +repage ascii.jpg
FeRD
26

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.txtestá 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,15adicionado como a primeira linha de texto (a 15,15 é um deslocamento posicional). Além disso, verifique se o texto real a ser convertido está entre aspas. Aspas simples ou duplas servirão, mas certifique-se de que não sejam usadas como parte de sua arte asciática, pois isso confundirá as coisas.

A fonte que você escolher deve ser uma fonte com espaçamento simples, caso contrário, o texto não será alinhado.

Isso produz: -

insira a descrição da imagem aqui

garethTheRed
fonte
Você tem uma dica de como obter uma lista de nomes de fontes válidos? Enquanto o Free Mono parece estar instalado no meu sistema, o imagemagick não o reconhece.
Raphael
1
@ Rafael: Você pode obter uma lista de fontes disponíveis no momento a partir de qualquer comando ImageMagick (incluindo converter) usando a -listopção Então, por exemplo convert -list font, mostraria todos os argumentos possíveis para -font.
FeRD
Você também pode instalar este programa usando sudo yum install ImageMagick.
rangsiman
@ R.Ketkaew Esse comando é válido para alguém executando o Fedora 21 ou inferior, ou para algumas revisões do RHEL (nem tenho certeza se o último ainda está usando o yum). No Fedora 22+, o comando install é sudo dnf install ImageMagicke, na maioria das outras distribuições populares do Linux, haverá algum sudo apt-get install ...comando. Independentemente disso, as informações acima assumem que o ImageMagick está instalado no sistema em questão.
Ferd
18

Acho que o -annotateoperador do ImageMagick é um pouco mais conveniente do que o -drawmétodo sugerido por TheRed, pela simples razão de que ele não requer modificação no arquivo de entrada. Não é tão poderoso quanto -draw, mas para o descarte 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 precisar modificar o arquivo "ascii.txt" para conter a text 15x15parte da -drawprimitiva.

Especificando argumentos

O argumento para -fontpode 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 ImageMagick pode ser obtida usando o -listoperador, para convert -list fontexibir todos os argumentos possíveis para -font.

Os argumentos para -annotate(até que ponto deslocar 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 (deslocamento vertical em y) deve ser pelo menos igual ao tamanho do ponto da fonte escolhida (o argumento para -pointsize), porque o ImageMagick colocará a linha de base da fonte no deslocamento especificado. Portanto, se você não mudar a fonte para pelo menos pointsizepixels, a parte superior da primeira linha será cortada.

Eu recomendo passar por vários pixels, pelo menos, então se você estiver usando -pointsize 64, você deve emparelhá-lo com algo parecido -annotate +15+80. (Não há motivo para aumentar o deslocamento horizontal com tamanhos de fonte maiores, ele 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. Normalmente, apenas escolho valores excessivos, depois aproveito o ImageMagick -trime -bordercorro o resultado automaticamente. 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, apara o excesso de espaço em branco, exceto por uma borda de 10 pixels ao redor do texto. No +repagefinal, impede que o PNG de saída seja criado com um deslocamento de imagem, o que faria com que o GIMP exibisse uma caixa de diálogo ao carregar perguntando se deveria aplicar o deslocamento.

(Obviamente, 1000x2000 é excessivo para arquivos de texto pequenos e, para arquivos mais longos, pelo menos a dimensão vertical pode precisar ser aumentada. Porém, é mais fácil superestimar, pois o único custo é convertconsumir 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 (por exemplo, se ele usa linhas muito longas), talvez seja necessário reformatá-lo antes de entregá-lo convert. O ImageMagick não quebra o texto; portanto, cada linha de texto aumentará seu comprimento horizontalmente. Felizmente, é possível executar o arquivo através dos formatadores de linha de comando que você desejar e canalizar o texto processado em convertvez 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 renderizará o conteúdo do ascii.txtDejaVu Sans Condensed de 24 pontos, depois de processado pelo fmtcomando, 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 haja longas sequências contínuas com mais de 75 caracteres, como URLs, nesse caso, elas serão estendidas.)

Depois de fmtreformatar o texto, ele será passado para o convertqual renderizará a fmtsaída canalizada , como se estivesse lendo o arquivo diretamente. (Especificar um nome de arquivo de -é uma abreviação do shell UNIX bastante comum para "ler da entrada padrão, em vez de qualquer arquivo de disco nomeado", e as ferramentas do ImageMagick seguem essa convenção.)

FeRD
fonte
1
O componente y do annotateargumento deve ser maior que o tamanho do ponto para garantir que tudo apareça: convert -size 1000x2000 xc:white -font "FreeMono" -pointsize 123 -fill black \ -annotate +0+123 "@ascii.txt" -trim -bordercolor "#FFF" -border 10 +repage image.pngonde 123está o tamanho desejado. Além disso, você pode usar convert -list fontpara descobrir quais fontes são suportadas ( "FreeMono"não é universalmente suportada).
Alec Jacobson
1
Correção: convert -list fonté a sintaxe correta, não convert -list fonts.
Sopalajo de Arrierez
1
@CiroSantilli mm 改造 中心 法轮功 六四 mm Hmm, boa pergunta. Minha instalação do IM7 não possui nenhuma política definida /etc/ImageMagick-7/policy.txtque interfira em qualquer um desses formulários de conversão. Você sabe qual política está bloqueando a conversão e por que está definida? (Além disso, agarrando em palhas: Será que o canalizada fmt ...forma da obra de comando, por acaso Se assim for, você poderia simplesmente substituir? fmtCom cat, e obter o mesmo resultado que a @ascii.txtversão.)
Ferd
1
@CiroSantilli 事件 改造 中心 法轮功 六四 事件 Ah, mais uma pergunta: você especificou "falhou ... com o smoking sem os metadados feios". Isso significa que convert é bem-sucedido quando você usa o -drawformulário de @ garethTheRed e insere os comandos de posicionamento no ascii.txtarquivo? Seria muito bizarro, se for esse o caso, parece-me, já que estou tendo problemas para imaginar quais preocupações de segurança haveria com as -annotatequais também não se aplicariam ao -drawtrabalhar com o conteúdo de um arquivo de texto importado.
FeRD 10/10/19
1
Eu nem tentei a resposta de Gareth por causa dos metadados feios, mas isso funcionou agora. Meu /etc/ImageMagick-6/policy.xmlcontém, <policy domain="path" rights="none" pattern="@*"/>então acho que é esse. stdin também não funciona, provavelmente porque também possui o @-padrão. Para os desesperados, "$(cat ascii.txt)"funciona se não aumentar o comprimento da CLI.
Ciro Santilli escreveu: