2015-12-18 60 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計算給定重力的最佳偏移量,但如果文本超出了im的範圍,則沒有任何文字包裝年齡。

方法2有方法1的問題加上它假定已經計算了正確的偏移量,所以文本被寫在正確的位置。

如何將自動換行添加到2種方法之一,但最好是方法1?

P.S:ImageMagick的具有自動換使用標題選項,但我找不到標題中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

相關問題