用字母填充孔


18

有时候,当我无聊时,我会拿一些文字并在字母中填上“空洞”。但是,填补漏洞不是您最无聊的事情吗?我认为我们应该使它自动化,以便可以更好地利用我们的时间。

适用标准规则。

输入值

一个字符串,包含字母数字字符(az,AZ,0-9)和空格的序列。

输出量

图像包含渲染的字符串,并填充了孔。您可以使用任何人类可读的字体,只要它仍然需要填补空白即可。您可以将图像保存到文件i.png(PNG格式),也可以只显示图像。

图片属性:

  • 黑色文字
  • 白色或透明背景
  • 填充:
    • 图片的尺寸最大为文字尺寸的两倍
    • 填充应与背景颜色相同,白色或透明

输入: Example text

输出: 输出示例


2
有关。(同样的挑战,不同的得分。)
Martin Ender

字母是否有最小字体大小(以像素为单位)?
Martin Ender

是的,可以说是12px
Hannes Karppila

Answers:


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拥有长久的内置名称(例如ImageSubtract和),也经常会获胜DeleteBorderComponents
J Atkin

这是因为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

从输出中截取

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.