Existe um programa de linha de comando que possa converter uma imagem em uma imagem artística ASCII?


19

Existe um programa de linha de comando (para Linux) que pode converter uma imagem em arte ascii e salvar essa saída como imagem, por exemplo, jpg ou png?

Para ilustrar o que eu preciso, quero converter a imagem abaixo em arte ascii insira a descrição da imagem aqui

A saída que eu desejo de um programa deve ser semelhante a esta, criada por meio de uma captura de tela da saída de um conversor de imagem para ascii (a saída era texto puro)

insira a descrição da imagem aqui

Estou ciente de que o GIMP tem a capacidade de salvar uma imagem como arte ascii e o aview também pode converter uma imagem em ascii. No entanto, o primeiro não pode ser feito via linha de comando e o último apenas permite visualizar a saída, não salvá-la (não quero recorrer a uma captura de tela da saída).

Também estou ciente de que a libcaca pode salvar sua saída em uma imagem, mas só gera ascii coloridos, como abaixo.

insira a descrição da imagem aqui

Feito convertendo a imagem de origem em escala de cinza e, em seguida, com o seguinte comando:

img2txt -W 70 -f tga input.jpg > output.tga

O motivo para desejar um programa de linha de comando é processar em lote uma pasta cheia de imagens.


1
Eu nunca tentei, mas sei que é possível canalizar texto para convert(ImageMagick). Se você definir o -f saída do img2txt para ansi (em vez de ansi colorido), você pode enviar o resultado para converter (ou outro software adequado)
horatio

@horatio: convert parece esperar uma entrada de arquivo e se recusa a ler de um pipe. Podemos fazê-lo através de um arquivo temporário de qualquer maneira.
Takkat 28/05

Respostas:


7

Você pode usar este código python que criei para criar arte ascii a partir de imagens estáticas e vídeos:

https://gist.github.com/lindylex/9374326

Saída de exemplo

Original insira a descrição da imagem aqui

Saída de arte ASCII ( python ascii_movie_image_ver_1.py cat.jpg 4 10) insira a descrição da imagem aqui


2
os links vêm e vão, mesmo que seja o seu próprio site ... você poderia adicionar duas capturas de tela de "antes" e "depois" usando seu código?
Ilan

4
@Ilan eu adicionei um exemplo e apontou para um repositório git pública
hellocatfood

14

Caso você pareça estar executando o Linux, você pode costurar os aplicativos facilmente para obter o resultado desejado. Isso também pode ser incorporado ao seu script de processamento em lote.

O exemplo abaixo faz uso do jp2a , um poderoso conversor de JPG para ASCII-art com muitas opções para alcançar os resultados desejados (consulte a página de manual). Em seguida, processamos o arquivo de texto ASCII resultante em uma imagem usando o convert do pacote ImageMagick . Novamente, existem muitas opções para ajustar o resultado. É provável que ambos os aplicativos estejam disponíveis nos repositórios da sua distribuição.

O script de exemplo abaixo produzirá uma imagem de arte ASCII (o formato dependendo da extensão que fornecemos .jpgé para JPEG) a partir de uma imagem JPEG de entrada. A fonte é renderizada para 160 caracteres de largura em 6 pt. Isso será ajustado apenas no tamanho da página padrão, conforme predefinido na conversão.

#! /bin/bash
#Usage ./j2asc infile.jpg outfile.jpg

echo "converting $1 to $2"
jp2a --width=160 -i  $1 --output=tmp.txt
convert -font Courier -pointsize 6 tmp.txt $2

Este é provavelmente o mais próximo que chegarei da saída desejada. Obrigado!
Hellocatfood #

Existe uma maneira de especificar a largura para ser algo diferente então 835px? Quero converter a arte ascii em uma 1920x1080imagem de papel de parede, mas quando passo a -resize 1920x1080opção, a largura permanece em 835px.

@awashburn: o tamanho da imagem é determinado pelo número de caracteres (largura) e tamanho dos pontos. Amplie o tamanho do ponto para obter uma saída maior ou dimensione a imagem resultante em uma segunda execução.
Takkat

1
Para os usuários do MacOS: jp2a também está disponível via homebrew e em execução: brew install jp2a.
K0pernikus

1
Considere também uma saída direta para html em alguns casos: jp2a --html --width=160 --chars="\'\"love" input.jpg --output=output.htm. Você pode especificar o seu conjunto preferido de caracteres para a renderização (você precisará escapar dos metacaracteres se desejar usá-los). Para jp2a, veja também AUR para Arch .

2

No Node.js Knockout 2012, houve um envio vencedor que pegou um feed de vídeo da webcam e soltou um "feed ascii":

Asciigram

Página Asciigram

O Asciigram é uma "ferramenta de produtividade" que permite criar vídeos e imagens ASCII usando sua webcam. Você também pode criar imagens ASCII arrastando imagens para a página. [Ligação]

Não é exatamente a linha de comando, mas talvez você possa adaptá-lo para suas necessidades. A biblioteca que eles usam para converter a imagem em ascii é chamada Jscii .


1
Ele produz apenas texto e não imagens. Além disso, ele não é um programa de linha de comando
hellocatfood


1

Você parece estar usando Linux e já conhece a libcaca. Há outra biblioteca que faz exatamente o que você diz (Imagem para Ascii na linha de comando): Aalib .

Existem muitos programas que fazem isso. Este funciona tanto no Linux quanto no Windows . Não usa bibliotecas externas, código fonte completo disponível, etc ...


Tanto quanto sei, o Aalib não pode salvar sua saída diretamente em uma imagem - algum método envolvendo capturas de tela precisaria ser usado, o que não seria confiável para imagens grandes. Se existe uma maneira de fazer isso usando o Aalib, você pode atualizar sua resposta? O programa que você mencionou parece muito bom. Faz conversão em lote e existe uma interface de linha de comando para ele?
hellocatfood

1

Desde que eu saiba que o programa não tem uma interface de linha de comando, mas converte imagens em texto e depois em imagens. A fonte está disponível, para que você possa usá-la para escrever sua própria ferramenta.

Você está certo, o aalib não gera imagens, mas gera texto. Assim como muitos outros programas que funcionam na linha de comando.

Se você estiver usando Linux, existe um programa de linha de comando chamado asciitopgm que converterá texto ascii em um bitmap. Faz parte do pacote netpbm.

Então você pode usar uma combinação de ferramentas:

  1. aalib para desenhar uma imagem usando texto
  2. asciitopgm para criar um bitmap pgm com o arquivo de texto.
  3. (opcional) Use convert (do pacote Imagemagick) para converter o pgm em qualquer outro formato raster desejado.

Eu acho que você pode fazer o que quiser dessa maneira.


0

Sim, existe uma ferramenta chamada jp2aque basicamente converte uma imagem jpg em uma arte ascii.

Por exemplo:

$ jp2a skull.jpg

Original Skull.jpg

insira a descrição da imagem aqui

Arte Ascii de Saída

insira a descrição da imagem aqui

Certifique-se de usar a imagem jpg. Se a sua imagem estiver em outro formato, você poderá alterá-la

$ convert skull.png skull.jpg

1
Olá e bem-vindo ao GDSE! Parece uma resposta duplicada. Você pode melhorá-lo editando-o ou, eventualmente, ser excluído.
curioso
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.