LinuxForum.Fans
Тема

Установка шрифтов в Magick++ (ImageMagick для C++)

Автор: Storm 7 сообщений 2023 просмотров
#273682

Нужно иметь возможность выводить на картинках текст.
В документации к Magick++ говорится про некие "fully qualified X font names", и эти строки, большая часть содержания которых мне не ясна, используются для указания какой шрифт использовать при отрисовке надписи.

Вот кусок из руководства:

"Magick++ tutorial" написал:

DrawableFont::DrawableFont(const string& font_name) // 'font_name' is a string containing
// a fully qualified X font name
// Following is a listing of several font names generally available on Linux systems
// (fully qualified X font names)
// "-*-helvetica-[medium/bold]-[r/o]-normal-*-*-[80/100/120/140/180]-75-75-*-*-iso8859-1"
//
» typical usage size is 120
// "-misc-fixed-[medium/bold]-[r/o]-[normal/semicondensed]-*-*-[100/120/140/200]-75-75-*-*-iso8859-1";
//
» typical usage size is 120, and for this size all combinations are valid
//
» for all other sizes the combinations are restricted, but the ...-medium-r-normal-...
//

font variants work for all sizes
// Example of setting up a DrawableFont object
DrawableFont("-*-helvetica-medium-r-normal-*-*-120-*-*-*-*-iso8859-1");

Проблема в том что, я не могу выяснить какие "fully qualified X font names" доступны в моей системе.
Если я использую настройки из приведенного фрагмента, текст не отрисовывается. Если я просто закомментирую строку с этой настройкой - отрисовывается, видимо каким-то стандартным шрифтом.

text

identify -list font

выдает довольно обширный список, но как из него получить "fully qualified X font names"?

#273685

в сторону xfontsel стоит подумать...

#273783

Выбираю в ней шрифт, использую его в исходнике, в результате ошибки

Resource temporarily unavailable @ error/xwindow.c/XBestFont/831

нет, но и текст на картинке не отрисовывается.

#273918

шут его знает...
если выложишь минимальный компилируемый пример - могу посмотреть...

#273949
text
#include <cstdlib>
#include <list>
#include <iostream>
using namespace std;

#include <Magick++.h> using namespace Magick;

/* * */ int main (int argc, char** argv) { InitializeMagick(*argv); Image image = Image("180x100", "white"); list<Drawable> draw_list; // set the text font: the font is specified via a string representing // a fully qualified X font name (wildcards '*' are allowed) //draw_list.push_back(DrawableFont("-*-droid sans-*-*-*-*-*-*-*-*-*-*-*-ru")); // <=-- настройка шрифта // -misc-fixed-medium-o-semicondensed—13-*-*-*-c-60-iso8859-1 // -*-droid sans-*-*-*-*-*-*-*-*-*-*-*-ru // set the text to be drawn at specified position draw_list.push_back(DrawableText(10, 10, "Один два три"));

// set the text color (the fill color must be set to transparent) draw_list.push_back(DrawableStrokeColor(Color("black"))); draw_list.push_back(DrawableFillColor(Color(0, 0, 0, MaxRGB)));

image.draw(draw_list);

try { image.write("output_image.png"); } catch (Exception &error_) { cout << "Caught exception: " << error_.what() << endl; return 1; }

return 0; }

text

g++ -c -g -I/usr/include/ImageMagick -I. -MMD -MP -MF main.o.d -o main.o main.cpp
g++ `Magick++-config --cppflags --cxxflags --ldflags --libs` -o grm main.o
#273967

для списка шрифтов пользуй: convert -list font
никакие «fully qualified X font names» указывать не надо... просто обычное название, что после Font: стоит...
видать доки писались в те времена, когда шрифты были глупые, растровые и ни кто окромя иксов о них ничего поведать не мог...
отрендарил пару картинок с:

text

// отрендерил пару картинок с:
    draw_list.push_back(DrawableFont("Dejavu-Sans-Mono-Book"));
    draw_list.push_back(DrawablePointSize(20));

// и с:
draw_list.push_back(DrawableFont("Dejavu", NormalStyle, 400, NormalStretch));


ЗЫ: если и правда так правильно, то с тебя пиво...

#273980

:facepalm: по локоть...
Я истерзал гугл и оф. сайт, но не обратил внимания на второй конструктор...

Большое спасибо! Какой формат пива предпочтителен? :)

Войдите или зарегистрируйтесь, чтобы ответить.