2012-07-10 126 views
1

任何人都可以告诉我如何计算以像素为单位的字符串宽度,以像素为单位提供字体大小?我必须在Linux下做C吗?以像素为单位的字符串宽度

+3

很大程度上取决于你用什么引擎渲染你的文字,因为不同的发动机可能会暗示对付不同,字距信息等等。你一定不仅要提供字体大小,还要提供字体本身。 – MvG 2012-07-10 09:32:37

+0

好吧,如果我也提供字体,但是怎样才能继续下去呢?我在开始时就陷入了困境,因为我不知道如何获得英文字母的高宽比。我能在哪里得到这个? – 2012-07-10 09:37:35

+2

你还会打印文字,还是只是测量它?如果您打印它,告诉我们您想如何打印它。如果你只想测量,想象你想打印它,可能使用提供的答案中的库,并查看它们提供的测量信息。 – MvG 2012-07-10 09:46:00

回答

1

在最基本的情况中,假设它是一个固定长度的字体:

int string_width = strlen(str) * CHAR_WIDTH_PX; 

其中str是C字符串和CHAR_WIDTH_PX是字体的字符宽度。

但当然在不同的框架和系统中,事情是以不同的方式完成的。为了帮助你,我们需要更多关于你的环境的信息。

+0

我可以知道CHAR_WIDTH_PX为固定宽度的字体,但我必须为比例字体做。 – 2012-07-10 09:55:24

+0

@ShraddhaK你应该在你的问题中指定。 – Alex 2012-07-10 09:56:31

4

除非您有固定的字体(每个字符始终为X像素宽),否则您无法自己完成此操作。在这种情况下,当然总宽度= PixelPerChar * strlen(String)。

在一般比例字体的情况下,如果字符可能彼此“靠近”,例如A和V(​​称为“字距”的操作),则需要询问字体呈现库,例如, libGD2。这些库通常提供字符串的边界框,给定字体文件,大小,方向和其他参数。对于GD2使用gdImageStringFT

例子:

int bbox[8]; // x,y of the rectangle bounding the text: 
// see manual 

gdImageStringFT(NULL, // "Tell me only" 
     bbox,0, 
     "/home/lserni/fonts/Verdana.ttf",18, 
     0.0,0,0,"Hello world"); 

if (checks on bbox OK) 
{ 
    gdImageStringFT(gdHandle, bbox, 0, ...); 
} 
相关问题