Füllen Sie die Löcher in Buchstaben

18

Manchmal, wenn ich gelangweilt bin, nehme ich Text und fülle die "Löcher" in den Buchstaben. Aber ist das Füllen der Löcher nicht das Langweiligste, was Sie tun können? Ich denke, wir sollten es automatisieren , damit wir unsere Zeit besser nutzen können.

Es gelten die Standardregeln für .

Eingang

Eine Zeichenfolge mit alphanumerischen Zeichen (az, AZ, 0-9) und Leerzeichen.

Ausgabe

Bild mit gerenderter Zeichenfolge und gefüllten Löchern. Sie können jede für Menschen lesbare Schriftart verwenden, solange die Löcher noch gefüllt werden müssen. Sie können das Bild entweder in einer Datei i.png(im PNG-Format) speichern oder es nur anzeigen.

Bildeigenschaften:

  • Schwarzer Text
  • Weißer oder transparenter Hintergrund
  • Polsterung:
    • Die Abmessungen des Bildes können maximal das Zweifache der Abmessungen des Textes betragen
    • Die Polsterung sollte die gleiche Farbe wie der Hintergrund haben, entweder weiß oder transparent

Beispiel

Eingang: Example text

Ausgabe: Beispielausgabe

Hannes Karppila
quelle
2
Verbunden. (gleiche Herausforderung, unterschiedliche Wertung.)
Martin Ender
Gibt es eine Mindestschriftgröße für die Buchstaben (in Pixel)?
Martin Ender
Ja, sagen wir es ist 12px
Hannes Karppila

Antworten:

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

Verwendet ImageMagick ( convert).

Beispielausgabe:

Probe

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

Das Deaktivieren von Antialiasing ist erforderlich, da ansonsten die Antialiasing-Innenbereiche der Buchstaben nicht überflutet würden. Das Festlegen einer großen Schriftgröße ist ebenfalls erforderlich, da einige Schriftarten "Lücken" in Buchstaben aufweisen, die bei kleinen Schriftgrößen "Löcher" aufweisen sollten (in meinen Tests wurde die aSchrift nicht mit der standardmäßigen kleinen Schriftgröße ausgefüllt).

Türknauf
quelle
8

Mathematica, 83 Bytes

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

Bildbeschreibung hier eingeben

Eine unbenannte Funktion, die eine Zeichenfolge als Eingabe verwendet und ein Bildobjekt zurückgibt. Die Idee ist DeleteBorderComponents, nur die Löcher zu behalten und diese dann vom Originalbild zu subtrahieren.

Martin Ender
quelle
3
Das Lustige ist, dass Mathematica oft auch mit lang eingebauten Namen wie ImageSubtractund gewinnt DeleteBorderComponents.
J Atkin
Das liegt daran, dass Mathematica für viele Dinge Namen eingebaut hat - Sie müssen nicht oft Ihre eigenen Funktionen erstellen.
Nur ASCII
4

SmileBASIC, 38 Bytes

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

Zeichnet schwarzen * Text auf den schwarzen Hintergrund und füllt dann mit der integrierten Funktion "Farbeimer" alle Bereiche außerhalb des Texts mit Weiß.
* (tatsächlich habe ich verwendet 00000008, was identisch mit transparent aussieht, aber als eine andere Farbe behandelt wird)

Bildbeschreibung hier eingeben

12Me21
quelle
2

Frisst ein bisschen am Text vorbei, aber es gibt auch eine Canvas-basierte Lösung:

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)

Bildbeschreibung hier eingeben

Nautilus
quelle
2

Nachschrift 273

[wurde ursprünglich für die zugehörige Herausforderung gepostet , aber ich habe die Zählung nie implementiert.]

Rendert jedes Zeichen normal, um den richtigen Abstand zum Vorrücken zu erhalten, und nimmt dann alle Kurven, die die Glyphe beschreiben, und füllt jede Kurve aus. Normalerweise werden die inneren und äußeren Kurven mit unterschiedlichen Ausrichtungen beschrieben, sodass eine Füllung den Innenraum leer lässt, unabhängig davon, ob die Wicklungsregel ungerade oder ungerade ist. Beim separaten Befüllen wird alles gefüllt.

/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

Eingerückt:

/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

Verwendung. Es wird erwartet, dass sich das Zeichenfolgenobjekt auf dem Stapel befindet, wenn das Programm gestartet wird. Zusätzliche Skalierung, um es sichtbar zu machen.

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

aus der Ausgabe ausschneiden

Luser Droog
quelle