Rellena los agujeros en letras

18

A veces, cuando estoy aburrido, tomo un texto y relleno los "agujeros" en las letras. ¿Pero no es llenar los agujeros lo más aburrido que puedes hacer? Creo que deberíamos automatizarlo , para poder usar nuestro tiempo mejor.

Aplican reglas estándar de .

Entrada

Una cadena que contiene una secuencia de caracteres alfanuméricos (az, AZ, 0-9) y espacios.

Salida

Imagen que contiene la cadena renderizada y los agujeros rellenados. Puede usar cualquier fuente legible por humanos siempre que sea necesario llenar los agujeros. Puede guardar la imagen en un archivo i.png(en formato png) o simplemente mostrar la imagen.

Propiedades de imagen:

  • Texto negro
  • Fondo blanco o transparente
  • Relleno:
    • Las dimensiones de la imagen pueden ser como máximo dos veces las dimensiones del texto.
    • El relleno debe ser del mismo color que el fondo, blanco o transparente.

Ejemplo

Entrada: Example text

Salida: Salida de ejemplo

Hannes Karppila
fuente
2
Relacionado. (mismo desafío, puntuación diferente.)
Martin Ender
¿Existe un tamaño de fuente mínimo para las letras (en píxeles)?
Martin Ender
Sí, digamos que es 12px
Hannes Karppila

Respuestas:

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

Utiliza ImageMagick ( convert).

Salida de muestra:

muestra

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

Se requiere deshabilitar el antialiasing porque, de lo contrario, las partes interiores antialias de las letras no inundarían el relleno. También es necesario establecer la fuente en un tamaño grande porque algunas fuentes tienen "espacios" en las letras que deberían tener "agujeros" en tamaños de fuente pequeños (en mis pruebas, ano se rellenó con el tamaño de fuente pequeño predeterminado).

Pomo de la puerta
fuente
8

Mathematica, 83 bytes

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

ingrese la descripción de la imagen aquí

Una función sin nombre que toma una cadena como entrada y devuelve un objeto de imagen. La idea es usar DeleteBorderComponentspara mantener solo los agujeros y luego restarlos de la imagen original.

Martin Ender
fuente
3
Lo curioso es que Mathematica gana a menudo incluso con nombres largos como ImageSubtracty DeleteBorderComponents.
J Atkin
Esto se debe a que Mathematica tiene nombres incorporados para muchas cosas: no necesita crear sus propias funciones con frecuencia.
Solo ASCII
4

SmileBASIC, 38 bytes

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

Dibuja texto negro * en el fondo negro, luego usa la función integrada "cubo de pintura" para llenar todo lo que esté fuera del texto con blanco.
* (en realidad lo usé 00000008, que parece idéntico a transparente, pero se trata como un color diferente)

ingrese la descripción de la imagen aquí

12Me21
fuente
2

Come un poco el texto, pero también hay una solución basada en el lienzo:

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)

ingrese la descripción de la imagen aquí

Nautilo
fuente
2

Posdata 273

[se publicó originalmente en el desafío relacionado , pero nunca implementé el conteo].

Representa cada personaje normalmente, para obtener el espacio correcto para avanzar, luego toma todas las curvas que describen el glifo y llena cada una. Normalmente, las curvas interior y exterior se describen con diferentes orientaciones, por lo que un relleno dejará el interior vacío, independientemente de si está utilizando la regla de devanado distinto de cero o la regla impar. Llenando por separado, todo se llena.

/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

Sangrado:

/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. Se espera que el objeto de cadena esté en la pila cuando se inicia el programa. Escalado adicional solo para hacerlo visible.

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

recorte de la salida

luser droog
fuente