문자로 구멍을 채우십시오


18

때로는 지루할 때 문자를 몇 개 쓰고 글자의 "구멍"을 채 웁니다. 그러나 구멍을 채우는 것이 가장 지루한 일이 아닙니까? 자동화 해야 하므로 시간을 더 잘 사용할 수 있습니다.

표준 규칙이 적용됩니다.

입력

영숫자 시퀀스 (az, AZ, 0-9)와 공백이 포함 된 문자열입니다.

산출

렌더링 된 문자열과 구멍이 포함 된 이미지가 채워졌습니다. 구멍을 채워야하는 한 사람이 읽을 수있는 글꼴을 사용할 수 있습니다. 이미지를 파일 i.png(PNG 형식)로 저장하거나 이미지를 표시 할 수 있습니다.

이미지 속성 :

  • 검은 색 텍스트
  • 흰색 또는 투명한 배경
  • 심:
    • 이미지의 크기는 텍스트 크기의 최대 두 배가 될 수 있습니다
    • 패딩은 배경과 같은 색이어야합니다 (흰색 또는 투명).

입력: Example text

산출: 출력 예


2
관련. (같은 도전, 다른 점수)
마틴 엔더

글자의 최소 글꼴 크기 (픽셀)가 있습니까?
Martin Ender

예, 12px라고 가정하겠습니다
Hannes Karppila

답변:


18

배쉬, 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

수학, 83 바이트

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

여기에 이미지 설명을 입력하십시오

문자열을 입력으로 사용하고 이미지 객체를 반환하는 명명되지 않은 함수입니다. 구멍 DeleteBorderComponents 유지 한 다음 원본 이미지에서 구멍을 빼는 데 사용 합니다 .


3
재미있는 것은 Mathematica가 ImageSubtractand와 같은 긴 내장 이름으로도 승리한다는 것입니다 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

[원래 관련 챌린지에 게시 되었지만 계산을 구현 한 적이 없습니다.]

각 문자를 정상적으로 렌더링하여 올바른 간격을 유지 한 다음 글리프를 설명하는 모든 커브를 가져 와서 각 문자를 채 웁니다. 일반적으로 내부 및 외부 곡선은 서로 다른 방향으로 설명되므로 0이 아닌 굴곡 규칙 또는 짝수 홀수 규칙을 사용하는지 여부에 관계없이 채우기는 내부를 비워 둡니다. 별도로 채우면 모두 채워집니다.

/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.