Isi lubangnya dengan huruf

18

Kadang-kadang ketika saya bosan, saya mengambil beberapa teks dan mengisi "lubang" di surat-surat. Tetapi bukankah mengisi lubang adalah hal paling membosankan yang dapat Anda lakukan? Saya pikir kita harus mengotomatiskannya , sehingga kita dapat menggunakan waktu kita lebih baik.

Aturan standar berlaku.

Memasukkan

String yang berisi urutan karakter alfanumerik (az, AZ, 0-9) dan spasi.

Keluaran

Gambar berisi string yang diberikan dan lubang di atasnya terisi. Anda dapat menggunakan font apa saja yang dapat dibaca manusia selama masih membutuhkan lubang. Anda dapat menyimpan gambar ke file i.png(dalam format png) atau hanya menampilkan gambar.

Properti gambar:

  • Teks hitam
  • Latar belakang putih atau transparan
  • Lapisan:
    • Dimensi gambar dapat maksimum dua kali dimensi teks
    • Padding harus berwarna sama dengan latar belakang, baik putih atau transparan

Contoh

Memasukkan: Example text

Keluaran: Contoh output

Hannes Karppila
sumber
2
Terkait (Tantangan yang sama, skor berbeda.)
Martin Ender
Apakah ada ukuran font minimum untuk huruf (dalam piksel)?
Martin Ender
Ya, katakan saja 12px
Hannes Karppila

Jawaban:

18

Bash, 135 byte

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

Menggunakan ImageMagick ( convert).

Output sampel:

Sampel

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

Menonaktifkan antialiasing diperlukan karena bagian interior antialiased dari surat tidak akan mengisi banjir. Mengatur font ke ukuran besar juga diperlukan karena beberapa font memiliki "celah" dalam huruf yang seharusnya memiliki "lubang" di dalamnya pada ukuran font kecil (dalam tes saya, atidak diisi pada ukuran font kecil standar).

Gagang pintu
sumber
8

Mathematica, 83 byte

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

masukkan deskripsi gambar di sini

Fungsi tanpa nama yang mengambil string sebagai input dan mengembalikan objek gambar. Idenya adalah menggunakan hanyaDeleteBorderComponents untuk menjaga lubang dan kemudian mengurangi mereka dari gambar aslinya.

Martin Ender
sumber
3
Yang lucu adalah bahwa Mathematica sering menang bahkan dengan nama-nama lama seperti ImageSubtractdan DeleteBorderComponents.
J Atkin
Itu karena Mathematica memiliki banyak nama untuk banyak hal - Anda tidak perlu membuat fungsi sendiri sesering mungkin.
ASCII
4

SmileBASIC, 38 byte

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

Gambarlah teks hitam * di latar belakang hitam, lalu gunakan fungsi "ember cat" bawaan untuk mengisi semua yang di luar teks dengan warna putih.
* (sebenarnya saya gunakan 00000008, yang terlihat identik dengan transparan, tetapi diperlakukan sebagai warna yang berbeda)

masukkan deskripsi gambar di sini

12Me21
sumber
2

Menggerogoti teks sedikit, tetapi ada juga solusi berbasis kanvas:

JS, 610 byte

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)

masukkan deskripsi gambar di sini

Nautilus
sumber
2

Catatan tambahan 273

[Awalnya diposting ke tantangan terkait , tapi saya tidak pernah menerapkan penghitungan.]

Render setiap karakter secara normal, untuk mendapatkan jarak yang benar untuk maju, lalu ambil semua kurva yang menggambarkan mesin terbang dan isi masing-masing. Biasanya kurva interior dan eksterior dijelaskan dengan orientasi yang berbeda, sehingga isian akan membiarkan interior kosong, terlepas dari apakah itu menggunakan aturan belitan non-nol atau aturan genap. Mengisi secara terpisah, semuanya terisi.

/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

Bertakuk:

/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

Pemakaian. Objek string diharapkan berada di tumpukan ketika program dimulai. Penskalaan ekstra hanya untuk membuatnya terlihat.

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

snip dari output

luser droog
sumber