Delikleri harflerle doldurun


18

Bazen sıkıldığımda, biraz metin alıp harflerin "deliklerini" dolduruyorum. Ancak delikleri doldurmak yapabileceğiniz en sıkıcı şey değil mi? Sanırım bunu otomatikleştirmeliyiz , böylece zamanımızı daha iyi kullanabiliriz.

Standart kuralları geçerlidir.

Giriş

Alfasayısal karakter dizisini (az, AZ, 0-9) ve boşlukları içeren bir dize.

Çıktı

Oluşturulan dize ve üzerinde delikler içeren resim dolduruldu. Deliklerin doldurulmasını gerektirdiği sürece, okunabilir herhangi bir yazı tipini kullanabilirsiniz. Görüntüyü dosyaya i.png(png formatında) kaydedebilir veya görüntüyü görüntüleyebilirsiniz.

Görüntü özellikleri:

  • Siyah metin
  • Beyaz veya şeffaf arka plan
  • Dolgu malzemesi:
    • Görüntünün boyutları metnin boyutlarının en fazla iki katı olabilir
    • Dolgu, beyaz veya şeffaf arka planla aynı renkte olmalıdır

Misal

Giriş: Example text

Çıktı: Örnek çıktı


2
İlişkili. (aynı meydan okuma, farklı puanlama.)
Martin Ender

Harfler için minimum piksel boyutu var mı (piksel olarak)?
Martin Ender

Evet, diyelim ki 12px
Hannes Karppila

Yanıtlar:


18

Bash, 135 bayt

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

ImageMagick ( convert) kullanır .

Örnek çıktı:

örneklem

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

Kenar yumuşatmayı devre dışı bırakmak gerekir, aksi takdirde harflerin kenar yumuşatmalı iç kısımları taşmaz. Yazı tipini büyük boyuta ayarlamak da gereklidir, çünkü bazı yazı tiplerinde küçük yazı tipi boyutlarında "delik" olması gereken harflerde "boşluklar" vardır (testlerimde, avarsayılan küçük yazı tipi boyutunda doldurulmamıştır).


8

Mathematica, 83 bayt

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

resim açıklamasını buraya girin

Dizeyi girdi olarak alan ve bir görüntü nesnesi döndüren adsız bir işlev. Fikir, sadece delikleri DeleteBorderComponentstutmak ve daha sonra orijinal görüntüden çıkarmak için kullanmaktır .


3
Komik olan şey, Mathematica'nın ImageSubtractve gibi uzun yerleşik isimlerle bile sık sık kazanmasıdır DeleteBorderComponents.
J Atkin

Bunun nedeni, Mathematica'nın birçok şey için isimler oluşturmasıdır - sık sık kendi işlevlerinizi oluşturmanız gerekmez.
Sadece ASCII

4

SmileBASIC, 38 bayt

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

Siyah arka plan üzerine siyah * metin çizer, ardından metnin dışındaki her şeyi beyazla doldurmak için yerleşik "boya kovası" işlevini kullanır.
* (aslında kullandım 00000008, şeffafla aynı görünüyor, ancak farklı bir renk olarak değerlendiriliyor)

resim açıklamasını buraya girin


2

Metinde biraz yiyor ama tuval tabanlı bir çözüm de var:

JS, 610 bayt

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)

resim açıklamasını buraya girin


2

PostScript 273

[başlangıçta ilgili soruna gönderildi , ancak sayımı hiçbir zaman uygulamadım.]

İlerlemek için doğru aralığı elde etmek üzere her karakteri normal şekilde işler, ardından glifi tanımlayan tüm eğrileri alır ve her birini doldurur. Normalde iç ve dış eğriler farklı yönlerde tanımlanır, bu nedenle bir dolgu, sıfır olmayan sargı kuralı veya çift tek kural kullanıyor olsun, iç kısmı boş bırakacaktır. Ayrı doldurma, her şey doldurulur.

/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

Girintili'ye:

/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

Kullanımı. Dize nesnesinin program başlatıldığında yığının üzerinde olması beklenir. Sadece görünür hale getirmek için ekstra ölçeklendirme.

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

çıktıdan kırp

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.