Заполните дыры в письмах


18

Иногда, когда мне скучно, я беру текст и заполняю «дыры» в письмах. Но разве заполнение дыр не самая скучная вещь, которую вы можете сделать? Я думаю, что мы должны автоматизировать это , чтобы мы могли лучше использовать наше время.

Применяются стандартные правила .

вход

Строка, содержащая последовательность буквенно-цифровых символов (az, AZ, 0-9) и пробелов.

Выход

Изображение, содержащее визуализированную строку и заполненные отверстия. Вы можете использовать любой читаемый человеком шрифт, если он все еще требует заполнения отверстий. Вы можете сохранить изображение в файл i.png(в формате png) или просто отобразить изображение.

Свойства изображения:

  • Черный текст
  • Белый или прозрачный фон
  • Обивка:
    • Размеры изображения могут быть в два раза больше размеров текста.
    • Обивка должна быть того же цвета, что и фон, белая или прозрачная

пример

Входные данные: Example text

Выход: Пример вывода


2
Связанный. (тот же вызов, другой выигрыш.)
Мартин Эндер

Существует ли минимальный размер шрифта для букв (в пикселях)?
Мартин Эндер

Да, допустим, это 12px
Ханнес Карппила

Ответы:


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

Mathematica, 83 байта

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

введите описание изображения здесь

Безымянная функция, которая принимает строку в качестве входных данных и возвращает объект изображения. Идея заключается в том , чтобы использовать , DeleteBorderComponentsчтобы держать только отверстие , а затем вычесть те из исходного изображения.


3
Самое смешное, что Mathematica часто побеждает даже с длинными встроенными именами, такими как ImageSubtractи DeleteBorderComponents.
Дж Аткин

Это потому, что 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

отрываться от вывода

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.