2015-12-18 4 views
0

Я пытаюсь добавить текст к изображениям в Magick ++ делая так:Как добавить перенос слов в текстах в Magick ++

Метод 1:

Magick::Image image(Magick::Geometry(800,800),Magick::Color("white")); 
Magick::Color color(0,0,0,0); 
image.font("Waree"); 
image.fontPointsize(36); 
image.strokeColor(color); 
image.fillColor(color); 
image.annotate("HelloWorld!", NorthWestGravity); 

Способ 2:

Magick::Image image(Magick::Geometry(800,800),Magick::Color("white")); 
Magick::Color color(0,0,0,0); 
std::list<Magick::Drawable> text_draw_list; 
text_draw_list.push_back(Magick::DrawableViewbox(0,0,image.columns(), image.rows())); 
text_draw_list.push_back(Magick::DrawableFont("Waree", (Magick::StyleType)NormalStyle, 400, (Magick::StretchType)NormalStretch)); 
text_draw_list.push_back(Magick::DrawablePointSize(36)); 
//Manual offsets 
text_draw_list.push_back(Magick::DrawableText(0, 200, "HelloWorld!")); 
text_draw_list.push_back(Magick::DrawableStrokeColor(color)); 
text_draw_list.push_back(Magick::DrawableFillColor(color)); 
image.draw(text_draw_list); 

Метод 1 вычисляет наилучшие смещения, учитывая гравитацию, но не имеет никакой упаковки слов, если текст выходит за пределы им возраст.

Метод 2 имеет проблему метода 1 плюс он предполагает, что правильные смещения рассчитаны, чтобы текст был записан в правильном положении.

Как добавить автоматическую перенос слов к одному из двух методов, но предпочтительно к методу 1?

P.S: ImageMagick имеет автоматический перенос слов с помощью титров варианта, но я не мог найти Caption в Magick ++.

Редактировать: Угловое управление границами на основе размера шрифта.

Magick::Image image(Magick::Geometry(800,800),Magick::Color("white")); 
Magick::Color color(0,0,0,0); 
image.font("Waree"); 
image.fontPointsize(36); 
image.strokeColor(color); 
image.fillColor(color); 
std::string txt = "HelloWorld!"; 
Magick::TypeMetric typeMetrics; 
double fontSize = 36; 
image.fontTypeMetrics(txt, &typeMetrics); 
while(fontSize > 0) 
{ 
if(typeMetrics.textWidth() >= image.columns() || typeMetrics.textHeight() >= image.rows()) 
{ 
    fontSize--; 
    image.fontTypeMetrics(txt, &typeMetrics); 
} 
} 
image.annotate(txt, NorthWestGravity); 

ответ

2

Самое лучшее, что нужно сделать, это прочитать caption.c источник, и понять, как реализуется слово-обертывание. Это позволит вашему приложению иметь полный контроль.

Другим вариантом было бы использовать протокол PANGO:. Это позволит вашему контенту-автору иметь полный контроль над переносом слов, форматированием и многими другими функциями отображения шрифтов.

Но для быстрого приближения, как вы упомянули, подпись уже делает это. Но заголовок - это не метод, а протокол файлов.

#include <Magick++.h> 

using namespace Magick; 

int main(int argc, const char * argv[]) { 
    InitializeMagick(argv[0]); 
    Image words(Geometry(250,250), Color("white")); 
    words.backgroundColor(Color("lime")); // might not be needed. 
    words.font("Avenir-Heavy"); 
    words.fillColor(Color("firebrick")); 
    words.strokeColor(Color("yellow")); 
    words.read("CAPTION:Hello World!"); // <---- CAPTION: protocol 
    words.write("/tmp/words.jpg"); 
    return 0; 
} 

word wrapping in Magick++

+0

Великий ответ еще раз! Почему вы все это знаете?!?! Я добавил грязный пограничный контроль, основанный на размере шрифта, поскольку я не мог найти перенос слов. – zindarod

+2

Рад, что это было полезно, но настоящий кредит принадлежит Энтони Тиссену и его удивительной [работе] (http://www.imagemagick.org/Usage/). – emcconville