Preencha os buracos nas letras

18

Às vezes, quando estou entediado, pego algum texto e preenchei os "buracos" nas letras. Mas preencher os buracos não é a coisa mais chata que você pode fazer? Acho que devemos automatizá-lo , para que possamos usar melhor nosso tempo.

Aplicam-se as regras de padrão .

Entrada

Uma sequência contendo sequência de caracteres alfanuméricos (az, AZ, 0-9) e espaços.

Resultado

Imagem contendo a sequência renderizada e os furos preenchidos. Você pode usar qualquer fonte legível por humanos, desde que ainda seja necessário preencher os furos. Você pode salvar a imagem em um arquivo i.png(em formato png) ou apenas exibir a imagem.

Propriedades da imagem:

  • Texto em preto
  • Fundo branco ou transparente
  • Preenchimento:
    • As dimensões da imagem podem ter no máximo duas vezes as dimensões do texto
    • O preenchimento deve ter a mesma cor do plano de fundo, branco ou transparente

Exemplo

Entrada: Example text

Resultado: Saída de exemplo

Hannes Karppila
fonte
2
Relacionado. (mesmo desafio, pontuação diferente).
Martin Ender
Existe um tamanho mínimo de fonte para as letras (em pixels)?
Martin Ender
Sim, digamos que seja 12 px
Hannes Karppila 13/02/16

Respostas:

18

Bash, 135 bytes

convert +antialias -pointsize 99 label:$1 -fill red -draw 'color 0,0 floodfill' -fill black -opaque white -fill white -opaque red i.png

Usa ImageMagick ( convert).

Saída de amostra:

amostra

convert
  +antialias                              # disable antialiasing
  -pointsize 99                           # annoyingly necessary (see below)
  label:$1                                # draw input text
  -fill red -draw 'color 0,0 floodfill'   # flood fill from (0,0) with red
  -fill black -opaque white               # replace all white with black
  -fill white -opaque red                 # replace all red with white
  i.png

É necessário desativar o antialiasing porque partes internas das letras com antialias não seriam preenchidas. A configuração da fonte para um tamanho grande também é necessária porque algumas fontes têm "lacunas" nas letras que devem ter "buracos" em tamanhos de fonte pequenos (nos meus testes, o atamanho não foi preenchido no tamanho de fonte pequeno padrão).

Maçaneta da porta
fonte
8

Mathematica, 83 bytes

ImageSubtract[s=Binarize@Rasterize@Style[#,FontSize->99],DeleteBorderComponents@s]&

insira a descrição da imagem aqui

Uma função sem nome que recebe uma string como entrada e retorna um objeto de imagem. A idéia é usar DeleteBorderComponentspara manter apenas os orifícios e subtrair os da imagem original.

Martin Ender
fonte
3
O engraçado é que o Mathematica vence frequentemente mesmo com nomes construídos longos como ImageSubtracte DeleteBorderComponents.
111716 JJ
Isso ocorre porque o Mathematica criou nomes para muitas coisas - você não precisa criar suas próprias funções com frequência.
somente ASCII
4

SmileBASIC, 38 bytes

??INPUT S$GPUTCHR.,2,S$,2,2,8GPAINT.,0

Desenha texto preto * no fundo preto e usa a função "balde de tinta" embutida para preencher tudo o que estiver fora do texto com branco.
* (na verdade eu usei 00000008, que parece idêntico a transparente, mas é tratado como uma cor diferente)

insira a descrição da imagem aqui

12Me21
fonte
2

Come um pouco o texto, mas também há uma solução baseada em tela:

JS, 610 bytes

function o(a,b){return a[b]+a[b+1]+a[b+2]}x=prompt();l=x.length;c=document.createElement("canvas");document.body.appendChild(c);h=33;w=18*l;c.height=h;c.width=w;n=255;m=764;t=c.getContext("2d");t.fillStyle="white";t.fillRect(0,0,w,h);t.fillStyle="red";t.fillRect(0,2,w,h);t.font="900 30px Courier";t.fillStyle="black";t.fillText(x,0,25);d=t.getImageData(0,0,w,h);f=0;q=d.data.length;for(i=0;i<20;i++){for(j=0;j<q;j+=4){f=d.data;if(o(f,j)>0&&(o(f,j-w*4)>m||o(f,j+w*4)>m||o(f,j-4)>m||o(f,j+4)>m)){f[j]=n;f[j+1]=n;f[j+2]=n}}}for(k=0;k<q;k+=4){f=d.data;if(f[k+1]<1){f[k]=0;f[k+1]=0;f[k+2]=0}}t.putImageData(d,0,0)

insira a descrição da imagem aqui

Nautilus
fonte
2

Postscript 273

[foi originalmente publicado no desafio relacionado , mas eu nunca implementei a contagem.]

Renderiza cada caractere normalmente, para obter o espaçamento correto para avançar, depois pega todas as curvas que descrevem o glifo e preenche cada um. Normalmente, as curvas internas e externas são descritas com orientações diferentes; portanto, um preenchimento deixará o interior vazio, independentemente de estar usando a regra de enrolamento diferente de zero ou a regra par-ímpar. Preenchendo separadamente, tudo é preenchido.

/Courier 9 selectfont
9 9 moveto{( ) dup 0 4 3 roll put currentpoint 3 2 roll
dup show currentpoint 3 2 roll 5 3 roll moveto
true charpath[[{/moveto
cvx}{/lineto cvx}{/curveto cvx}{/closepath cvx]cvx[}pathforall
pop]]{exec currentpoint fill moveto}forall pop moveto}forall

Recuado:

/Courier 9 selectfont
9 9 moveto
{
    ( ) dup 0 4 3 roll put
    currentpoint 3 2 roll
    dup show
    currentpoint 3 2 roll
    5 3 roll moveto
    true charpath
    [ [{/moveto cvx}{/lineto cvx}{/curveto cvx}{/closepath cvx]cvx[}
       pathforall pop] ]
    { exec currentpoint fill moveto } forall
    pop moveto
} forall

Uso. O objeto String deve estar na pilha quando o programa for iniciado. Escalonamento extra apenas para torná-lo visível.

$ gs -c '7 7 scale(Example Text)' -f courier.ps

recorte da saída

luser droog
fonte