ImageMagick (или другой) для текста UTF-8 к изображению


8

Я пытаюсь создать много односимвольных изображений, используя convert. Цель состоит в том, чтобы предоставить специалисту по пластике изображения для печати на клавишных клавиатурах.

Документация ImageMagick предлагает что-то вроде этого:

 printf "\u2318" | convert -size 100x100 label:@- -font unifont-Medium command.png

или

 echo ⌘ | convert -size 100x100 label:@- -font unifont-Medium command.png

или

 convert -size 100x100 label:'⌘' -font unifont-Medium command.png

который должен печатать символ места интереса , но вместо этого он создает знак вопроса.

Я подтвердил (используя charmap), что unifont-Mediumнабор шрифтов фактически включает этот глиф. Я знаю, что другие шрифты в моей системе также могут предоставить этот глиф, потому что я мог видеть его до установки unifont, но я не смог понять, как их зовут.

Я также пытался использовать LaTeX (например, TexLive со всеми дополнениями и utf8xпакетом), но ни один из специальных символов не поддерживается.

На форуме много вопросов о печати китайских иероглифов с помощью imagemagick и других специальных символов ... мне подходит следующее:

convert -background lightblue -fill blue -pointsize 32 \
      label:' é è à ù ç Ö ÿ ‘ ’ “ ” ° ² ³ € x ÷ '    label_i8n.gif

но это не работает для символов UTF-8, которые на самом деле важны для меня.

Как я могу конвертировать произвольные символы Юникода в изображения?

ОБНОВЛЕНИЕ : я сдался, похоже на ошибку. Вместо этого я создал несколько скриптов для генерации и рендеринга SVG, с открытым исходным кодом здесь: kinesis-dvorak


Я не использовал его долгое время, но я уверен, что вы могли бы сделать это с помощью простой процедуры «script-fu» для gimp . Это может быть не очень полезно для вас, если вы не знакомы с w / gimp и не знаете ни схему, ни другой язык, который портирует плагин (python, perl, tcl, их может быть больше) - но я бы хотел бросить это там на всякий случай.
Златовласка

Вышеупомянутое не работало для меня также. Похоже, ошибка в imagemagick, нет?
SLM

Btw. У меня
возник

Ответы:


10

Я попробовал те же команды и получил те же результаты.

$ printf "\u2318" | convert -size 100x100 label:@- \
        -font unifont-Medium command.png

                                                                           ss отрендеренного шрифта

Переход на юникод для буквы G работает нормально, хотя:

$ printf "\u0047" | convert -size 100x100 label:@- \
       -font unifont-Medium command.png

                                                                           г

Я хотел бы опубликовать этот вопрос на сайте Дискурса ImageMagick, чтобы понять, почему это происходит. Я могу помочь, если вы не уверены, как это сделать или продолжить.

Отладка конвертировать

Вы можете добавить -debug annotateпереключатель, чтобы увидеть, что convertдо.

пример

$ printf "\u2318" | convert -size 100x100 label:@- -font unifont-Medium -pointsize 40 -debug annotate command.png
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 12
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 6.375; height: 14; ascent: 11; descent: -3; max advance: 24; bounds: 0.625,0  6.78125,8; origin: 7,0; pixels per em: 12,12; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 12
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 6.375; height: 14; ascent: 11; descent: -3; max advance: 24; bounds: 0.625,0  6.78125,8; origin: 7,0; pixels per em: 12,12; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 24
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 12.75; height: 28; ascent: 22; descent: -5; max advance: 48; bounds: 1.25,0  13.5781,18; origin: 15,0; pixels per em: 24,24; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 48
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 25.5156; height: 55; ascent: 43; descent: -10; max advance: 96; bounds: 2.48438,0  27.1406,35.5; origin: 29,0; pixels per em: 48,48; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.010u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 96
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 53.0312; height: 110; ascent: 87; descent: -20; max advance: 192; bounds: 4.96875,0  54.2812,70; origin: 59,0; pixels per em: 96,96; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 96
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 53.0312; height: 110; ascent: 87; descent: -20; max advance: 192; bounds: 4.96875,0  54.2812,70; origin: 59,0; pixels per em: 96,96; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 95
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 52.0781; height: 109; ascent: 86; descent: -20; max advance: 190; bounds: 4.92188,0  53.7188,70; origin: 58,0; pixels per em: 95,95; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 94
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 51.1406; height: 108; ascent: 85; descent: -20; max advance: 188; bounds: 4.85938,0  53.1562,68; origin: 57,0; pixels per em: 94,94; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 93
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 51.1875; height: 107; ascent: 84; descent: -20; max advance: 186; bounds: 4.8125,0  52.5781,67; origin: 57,0; pixels per em: 93,93; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 92
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 50.2344; height: 106; ascent: 83; descent: -19; max advance: 184; bounds: 4.76562,0  52.0156,67; origin: 56,0; pixels per em: 92,92; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.020 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 91
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 50.2969; height: 105; ascent: 82; descent: -19; max advance: 182; bounds: 4.70312,0  51.4531,65.4688; origin: 56,0; pixels per em: 91,91; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 90
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 49.3438; height: 103; ascent: 81; descent: -19; max advance: 180; bounds: 4.65625,0  50.8906,65.4688; origin: 55,0; pixels per em: 90,90; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 89
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 48.3906; height: 102; ascent: 81; descent: -19; max advance: 178; bounds: 4.60938,0  50.3281,64; origin: 54,0; pixels per em: 89,89; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 88
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 48.4375; height: 101; ascent: 80; descent: -19; max advance: 176; bounds: 4.5625,0  49.7656,64; origin: 54,0; pixels per em: 88,88; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 87
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 47.5; height: 100; ascent: 79; descent: -18; max advance: 174; bounds: 4.5,0  49.1875,63; origin: 53,0; pixels per em: 87,87; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 86
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 47.5469; height: 99; ascent: 78; descent: -18; max advance: 172; bounds: 4.45312,0  48.625,63; origin: 53,0; pixels per em: 86,86; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 86
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/GetTypeMetrics/798/Annotate
  Metrics: text: ⌘; width: 47.5469; height: 99; ascent: 78; descent: -18; max advance: 172; bounds: 4.45312,0  48.625,63; origin: 53,0; pixels per em: 86,86; underline position: -5.0625; underline thickness: 3.35938
2014-04-10T09:37:04-04:00 0:00.030 0.020u 6.7.8 Annotate convert[16619]: annotate.c/RenderFreetype/1220/Annotate
  Font /usr/share/fonts/msttcorefonts/arialbd.ttf; font-encoding none; text-encoding none; pointsize 86

ОБНОВЛЕНИЕ № 1 - Отладка дальше

Эта проблема раздражала меня, поэтому я, наконец, понял это. Проблема заключается в выборе шрифта, и он не может отображать этот конкретный глиф.

  1. Прежде всего вы можете использовать эту команду, чтобы увидеть, какие шрифты у вас есть в наличии convert. Итак, начнем там.

    $ convert -list font | head -8
    
    Path: /etc/ImageMagick/type-ghostscript.xml
      Font: AvantGarde-Book
        family: AvantGarde
        style: Normal
        stretch: Normal
        weight: 400
        glyphs: /usr/share/fonts/default/Type1/a010013l.pfb
        ...
    

    Выше показан пример, каждый шрифт имеет строки, похожие на выше. Кстати, выполнение этой команды показывает, что у нас есть несколько сотен шрифтов:

    $ convert -list font | grep Font | wc -l
    262
    
  2. Далее мы собираемся выполнить задачу кодирования нашего персонажа, \u2318используя каждый шрифт, который у нас есть. Это звучит сложно, но довольно тривиально с некоторыми хорошо продуманными вкладышами через Bash.

    $ for i in $(convert -list font | grep Font | awk '{print $2}'); \
        do convert -font $i -pointsize 36 label:⌘  ${i}.gif;done
    

    Этот фрагмент будет использовать цикл for для прохождения каждого шрифта, запустив измененную версию вашей convertкоманды.

  3. Сейчас мы смотрим результаты. Многие из шрифтов не могли отображать этот конкретный глиф, но некоторые могли, что, по-видимому, указывает на то, что это не обязательно ошибка в ImageMagick, а скорее ограничение самих шрифтов. Вот список шрифтов, которые у меня были, которые могли отображать этот глиф.

    • DejaVu Sans-Жирный-
    • DejaVu-Санс-Bold-Косой
    • DejaVu Sans-книга
    • DejaVu-Санс-Сжатый-Bold
    • DejaVu-Санс-Сжатый-Bold-Косой
    • DejaVu-Санс-Сжатый
    • DejaVu-Санс-Сжатый-Косой
    • DejaVu Sans-Моно-Bold
    • DejaVu Sans-Моно-Bold-Косой
    • DejaVu Sans-Моно-Book
    • DejaVu-Санс-Mono-Косой
    • DejaVu-Санс-Косой
    • DejaVu-Serif-Bold
    • DejaVu-Serif-Bold-Italic
    • DejaVu Serif-книга
    • DejaVu-Serif-Сгущенное-Bold
    • DejaVu-Serif-Сгущенное-Bold-Italic
    • DejaVu засечек-Сгущенное
    • DejaVu-Serif-КОНДЕНСИРОВАННОГО Italic
    • DejaVu засечек-Italic
    • FreeMono-Regular
    • FreeSerif-Regular
    • STIX-Math-Regular
    • STIX-Regular
    • VL-готическом регулярные

    Я визуально просмотрел все ~ 260 полученных .gifфайлов, чтобы определить, что сработало, а что нет. Вот несколько примеров из тех, которые сработали, чтобы вы могли их увидеть.

                                                ss1    ss2    ss3    ss4    SS5

Ссылки


1
Большое спасибо за анализ! Я сдался ... Я обновил вопрос с возможным решением, которое включало использование SVG и inkscape для рендеринга шрифтов в пути.
Fommil

@fommil - похоже, проблема со шрифтом. Смотрите обновления.
SLM

было бы неплохо иметь заключительную команду в ответе (выбор шрифта)
Борис Деппен

Для меня добавление опции -font DejaVu-Sans-Boldпомогло пометить изображение пиратским черепом: perl -e 'binmode(STDOUT, ":utf8");print "Skull: \x{2620}";' |convert picture_orig.jpg -background none -fill red -pointsize 90 -font DejaVu-Sans-Bold label:@- -flatten picture_tagged.jpgспасибо за превосходную помощь!
Борис Деппен

Спасибо @slm! Ваш ответ внес вклад в мое решение: unix.stackexchange.com/a/389474/9689
Гжегож Вежовецкий,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.