Magick++: Проблемы с изображением -> draw() при рисовании текста

Я собрал ImageMagick-6.8.8 на Mac 10.9.2 со статическими библиотеками с поддержкой Magick++.

Теперь я пытаюсь выполнить следующий пример из учебника Magick ++ в формате pdf на странице 19 (я удалил комментарии из следующего кода

    DrawableText::DrawableText(double x, double y, const string& text_to_write)
    Image my_image(Geometry(320,220), Color("white"));

    list<Drawable> text_draw_list;
    text_draw_list.push_back(DrawableFont("-misc-fixed-medium-o-semicondensed—13-*-*-*-c-60-iso8859-1"));
    text_draw_list.push_back(DrawableText(101, 50, "text to write on the canvas"));
    text_draw_list.push_back(DrawableStrokeColor(Color("black")));
    text_draw_list.push_back(DrawableFillColor(Color(0, 0, 0, MaxRGB)));

    my_image.draw(text_draw_list);

Я получаю следующую ошибку:

Magick: non-conforming drawing primitive definition `text' @ error/draw.c/DrawImage/3193

Можете ли вы помочь мне понять это.

Также я не могу использовать аннотацию, так как я не скомпилировал поддержку X в своих библиотеках, и я считаю, что для использования аннотации требуется X...

Вот вывод моей команды configure

                  Option                        Value
-------------------------------------------------------------------------------
Shared libraries  --enable-shared=no        no
Static libraries  --enable-static=yes       yes
Module support    --with-modules=no     no
GNU ld            --with-gnu-ld=no      no
Quantum depth     --with-quantum-depth=16   16
High Dynamic Range Imagery
                  --enable-hdri=no      no

Install documentation:      yes

Delegate Configuration:
BZLIB             --with-bzlib=yes      yes
Autotrace         --with-autotrace=no       no
Dejavu fonts      --with-dejavu-font-dir=default    none
DJVU              --with-djvu=yes       no
DPS               --with-dps=yes        no
FFTW              --with-fftw=yes       no
FlashPIX          --with-fpx=yes        no
FontConfig        --with-fontconfig=yes     no
FreeType          --with-freetype=yes       no
GhostPCL          None              pcl6 (unknown)
GhostXPS          None              gxps (unknown)
Ghostscript       None              gs (unknown)
Ghostscript fonts --with-gs-font-dir=default    none
Ghostscript lib   --with-gslib=no       no
Graphviz          --with-gvc=no     
JBIG              --with-jbig=yes       no (failed tests)
JPEG v1           --with-jpeg=yes       yes
JPEG-2000         --with-jp2=       
LCMS v1           --with-lcms=yes       no
LCMS v2           --with-lcms2=yes      no
LQR               --with-lqr=yes        no
LTDL              --with-ltdl=yes       no
LZMA              --with-lzma=yes       yes
Magick++          --with-magick-plus-plus=yes   yes
MUPDF             --with-mupdf=no       no
OpenEXR           --with-openexr=yes        no
OpenJP2           --with-openjp2=yes        no
PANGO             --with-pango=yes      no
PERL              --with-perl=no        no
PNG               --with-png=yes        yes
RSVG              --with-rsvg=no        no
TIFF              --with-tiff=yes       yes
WEBP              --with-webp=yes       no
Windows fonts     --with-windows-font-dir=  none
WMF               --with-wmf=no     no
X11               --with-x=no           no
XML               --with-xml=yes        yes
ZLIB              --with-zlib=yes       yes

X11 Configuration:
      X_CFLAGS        = 
      X_PRE_LIBS      = 
      X_LIBS          = 
      X_EXTRA_LIBS    = 

Options used to compile and link:
  PREFIX          = /Users/awais/Downloads/Image_Magick/IMagick/im
  EXEC-PREFIX     = /Users/awais/Downloads/Image_Magick/IMagick/im
  VERSION         = 6.8.8
  CC              = clang
  CFLAGS          = -arch x86_64 -Wall -fexceptions -D_FORTIFY_SOURCE=0 -D_THREAD_SAFE -pthread -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16
  CPPFLAGS        = -I/Users/awais/Downloads/Image_Magick/IMagick/im/include/ImageMagick-6
  PCFLAGS         = -DMAGICKCORE_HDRI_ENABLE=0 -DMAGICKCORE_QUANTUM_DEPTH=16
  DEFS            = -DHAVE_CONFIG_H
  LDFLAGS         = -L/Users/awais/Downloads/Image_Magick/IMagick/im/tmp/lib -arch x86_64 -L/Users/awais/Downloads/Image_Magick/IMagick/ImageMagick-6.8.8-10/magick -L/Users/awais/Downloads/Image_Magick/IMagick/ImageMagick-6.8.8-10/wand -L/opt/local/lib
  MAGICK_LDFLAGS  = -L/Users/awais/Downloads/Image_Magick/IMagick/im/lib -L/Users/awais/Downloads/Image_Magick/IMagick/im/tmp/lib -arch x86_64 -L/Users/awais/Downloads/Image_Magick/IMagick/ImageMagick-6.8.8-10/magick -L/Users/awais/Downloads/Image_Magick/IMagick/ImageMagick-6.8.8-10/wand -L/opt/local/lib
  LIBS            = -ltiff -ljpeg -lpng16 -L/opt/local/lib -llzma -lbz2 -lxml2 -lz -lm
  CXX             = clang
  CXXFLAGS        = -arch x86_64 -D_THREAD_SAFE -pthread
  FEATURES        = DPC
  DELEGATES       = bzlib mpeg jng jpeg lzma png tiff xml zlib

person MuTaTeD    schedule 09.04.2014    source источник


Ответы (1)


Установка FontConfig, FreeType и Ghostscript . Вероятно, у вас уже есть X11 в системном каталоге /opt. Если нет, перейдите на XQuartz и запустите установку .dmg. Шрифты DejaVu и Window приятны, но не нужны. После установки библиотек шрифтов вам потребуется перенастроить ImageMagick (не забудьте make clean) и переустановить.

Для руководства по Magick++ следующая строка немного сбивает с толку, так как содержит несколько подстановочных знаков, с которыми вы, возможно, не знакомы.

DrawableFont("-misc-fixed-medium-o-semicondensed—13-*-*-*-c-60-iso8859-1")

Из API лучше начать с непосредственной инициализации шрифта.

Magick::DrawableFont::DrawableFont  ( const std::string & family_,
                                      Magick::StyleType   style_,
                                      const unsigned int  weight_,
                                      Magick::StretchType stretch_ 
                                    )

Найдите шрифт, который хотите использовать, запустив identify -list font

Font: Helvetica-Narrow
  family: Helvetica Narrow
  style: Normal
  stretch: Condensed
  weight: 400
  glyphs: /usr/local/share/ghostscript/fonts/n019043l.pfb 

Тогда это просто вопрос применения правильных параметров

DrawableFont font = DrawableFont("Helvetica Narrow",
                                  NormalStyle,
                                  400,
                                  SemiCondensedStretch
                                 );
text_draw_list.push_back(font);
text_draw_list.push_back(DrawableText(101, 50, "text to write on the canvas"));
text_draw_list.push_back(DrawableStrokeColor(Color("black")));
text_draw_list.push_back(DrawableFillColor(Color(0, 0, 0, MaxRGB)));

my_image.draw(text_draw_list);

Пример текста для написания на холсте

person emcconville    schedule 09.04.2014
comment
Спасибо за быстрые предложения. Я думаю о том, чтобы скомпилировать делегат FreeType с помощью ImageMagick вместо того, чтобы устанавливать его как общую библиотеку. Аналогично для X11, в моей системе установлен XQuatrz, но я хочу использовать статические библиотеки, чтобы мое приложение не зависело от какой-либо третьей стороны и чтобы все было встроено. Пожалуйста, дайте мне знать, следует ли мне также добавить делегатов для FontConfig и Призрачный скрипт тоже. - person MuTaTeD; 09.04.2014
comment
Я действительно определил требование для FreeType после попытки командной строки (после публикации этого вопроса) ./convert IMG_0001.JPG -resize 10% -draw "text 25,60 'Magick'" -channel RGBA -blur 0x6 -fill darkred -stroke magenta 1.JPG Это дало мне следующую ошибку convert: delegate library support not built-in 'none' (Freetype) @ warning/annotate.c/RenderFreetype/1537. convert: Postscript delegate failed '/var/tmp/magick-3247Mg-ixYma8Adp': No such file or directory @ error/ps.c/ReadPSImage/840. - person MuTaTeD; 09.04.2014
comment
Основываясь на приведенном выше совете, у меня сработало следующее: brew install ghostscript - person Nicodemuz; 11.08.2016