文字の穴を埋める


18

時々退屈しているとき、私はいくつかのテキストを取り、文字の「穴」を埋めます。しかし、穴を埋めることはあなたができる最も退屈なことではありませんか?私たちはそれを自動化すべきだと思うので、時間をより有効に使うことができます。

標準の規則が適用されます。

入力

英数字(az、AZ、0-9)およびスペースのシーケンスを含む文字列。

出力

レンダリングされた文字列とその上の穴を含む画像。穴を埋める必要がある限り、人間が読める任意のフォントを使用できます。画像をi.png(png形式で)ファイルに保存するか、単に画像を表示することができます。

画像のプロパティ:

  • 黒いテキスト
  • 白または透明の背景
  • パディング:
    • 画像の寸法は、テキストの寸法の最大2倍にすることができます
    • パディングは背景と同じ色、白または透明にする必要があります

入力: Example text

出力: 出力例


2
関連。(同じ課題、異なるスコアリング。)
マーティンエンダー

文字の最小フォントサイズ(ピクセル単位)はありますか?
マーティンエンダー

はい、12pxと言うことができます
ハンネスカルピーラ

回答:


18

Bash、135バイト

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)を使用します。

サンプル出力:

サンプル

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

そうしないと、文字の内側のアンチエイリアス処理された部分が塗りつぶされないため、アンチエイリアス処理を無効にする必要があります。一部のフォントには、小さなフォントサイズで「穴」が必要な文字に「ギャップ」があるため、フォントを大きなサイズに設定する必要があります(テストではa、デフォルトの小さなフォントサイズで塗りつぶされませんでした)。


8

Mathematica、83バイト

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

ここに画像の説明を入力してください

入力として文字列を取り、画像オブジェクトを返す名前のない関数。アイデアは、穴だけDeleteBorderComponentsを保持し、元の画像からそれらを差し引くために使用することです。


3
面白いことに、Mathematicaがさえのような長い組み込み名で頻繁に勝っていることであるImageSubtractDeleteBorderComponents
Jアトキン

それは、Mathematicaには多くのことのための組み込みの名前があるためです-頻繁に独自の関数を作成する必要はありません。
ASCIIのみ

4

SmileBASIC、38バイト

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

黒の背景に黒*のテキストを描画し、組み込みの「ペイントバケット」機能を使用して、テキストの外側のすべてを白で塗りつぶします。
*(実際に使用した00000008、これは透明と同じように見えますが、異なる色として扱われます)

ここに画像の説明を入力してください


2

テキストを少し食べますが、キャンバスベースのソリューションもあります:

JS、610バイト

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)

ここに画像の説明を入力してください


2

追記273

[もともと関連するチャレンジに投稿されていましたが、カウントを実装したことはありません。]

各文字を通常どおりにレンダリングして、正しい間隔を進めてから、グリフを記述するすべての曲線を取り、それぞれを塗りつぶします。通常、内部曲線と外部曲線は異なる方向で記述されるため、塗りつぶしでは、ゼロ以外のワインディングルールまたは偶奇ルールを使用しているかどうかに関係なく、内部は空のままになります。個別に記入すると、すべて記入されます。

/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

インデント:

/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

使用法。文字列オブジェクトは、プログラムの起動時にスタック上にあると予想されます。見えるようにするためだけの追加のスケーリング。

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

出力から切り取る

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.