php提取数据字体大小,文本的自动字体大小(通过PHP的GD)

我认为你寻找

imagettfbbox功能.

几年前我使用它来创建一个为Web界面生成本地化按钮的脚本.我实际上调整了按钮的大小,如果文本不适合模板,以保持文本大小一致,但您可以尝试减小文本大小,直到文本适合.

如果您有兴趣,我可以粘贴我的代码的一些片段(或立即给它).

[编辑]好的,这里是我的代码的一些摘录,有一天我会清理它(使它独立于目标应用程序,提供样本)并使其作为一个整体公开.

我希望这些片段有意义.

// Bounding boxes: ImageTTFBBox, ImageTTFText:

// Bottom-Left: $bb[0], $bb[1]

// Bottom-Right: $bb[2], $bb[3]

// Top-Right: $bb[4]; $bb[5]

// Top-Left: $bb[6], $bb[7]

define('GDBB_TOP', 5);

define('GDBB_LEFT', 0);

define('GDBB_BOTTOM', 1);

define('GDBB_RIGHT', 2);

#[ In class constructor ]#

// Get size in pixels, must convert to points for GD2.

// Because GD2 assumes 96 pixels per inch and we use more "standard" 72.

$this->textSize *= 72/96;

$this->ComputeTextDimensions($this->textSize, FONT, $this->text);

#[ Remainder of the class (extract) ]

/**

* Compute the dimensions of the text.

*/

function ComputeTextDimensions($textSize, $fontFile, $text)

{

$this->textAreaWidth = $this->imageHSize - $this->marginL - $this->marginR;

$this->textAreaHeight = $this->imageVSize - $this->marginT - $this->marginB;

// Handle text on several lines

$this->lines = explode(NEWLINE_CHAR, $text);

$this->lineNb = count($this->lines);

if ($this->lineNb == 1)

{

$bb = ImageTTFBBox($textSize, 0, $fontFile, $text);

$this->textWidth[0] = $bb[GDBB_RIGHT] - $bb[GDBB_LEFT];

$this->maxTextWidth = $this->textWidth[0];

$this->textHeight[0] = $bb[GDBB_BOTTOM] - $bb[GDBB_TOP];

}

else

{

for ($i = 0; $i < $this->lineNb; $i++)

{

$bb = ImageTTFBBox($textSize, 0, $fontFile, $this->lines[$i]);

$this->textWidth[$i] = $bb[GDBB_RIGHT] - $bb[GDBB_LEFT];

$this->maxTextWidth = max($this->maxTextWidth, $this->textWidth[$i]);

$this->textHeight[$i] = $bb[GDBB_BOTTOM] - $bb[GDBB_TOP];

}

}

// Is the given text area width too small for asked text?

if ($this->maxTextWidth > $this->textAreaWidth)

{

// Yes! Increase button size

$this->textAreaWidth = $this->maxTextWidth;

$this->imageHSize = $this->textAreaWidth + $this->marginL + $this->marginR;

}

// Now compute the text positions given the new (?) text area width

if ($this->lineNb == 1)

{

$this->ComputeTextPosition(0, $textSize, $fontFile, $text, false);

}

else

{

for ($i = 0; $i < $this->lineNb; $i++)

{

$this->ComputeTextPosition($i, $textSize, $fontFile, $this->lines[$i], false);

}

}

}

/**

* Compute xText and yText (text position) for the given text.

*/

function ComputeTextPosition($index, $textSize, $fontFile, $text, $centerAscDesc)

{

switch ($this->textAlign)

{

case 'L':

$this->xText[$index] = $this->marginL;

break;

case 'R':

$this->xText[$index] = $this->marginL +

$this->textAreaWidth - $this->textWidth[$index];

break;

case 'C':

default:

$this->xText[$index] = $this->marginL +

($this->textAreaWidth - $this->textWidth[$index]) / 2;

break;

}

if ($centerAscDesc)

{

// Must compute the difference between baseline and bottom of BB.

// I have to use a temporary image, as ImageTTFBBox doesn't use coordinates

// providing offset from the baseline.

$tmpBaseline = 5;

// Image size isn't important here, GD2 still computes correct BB

$tmpImage = ImageCreate(5, 5);

$bbt = ImageTTFText($tmpImage, $this->textSize, 0, 0, $tmpBaseline,

$this->color, $fontFile, $text);

// Bottom to Baseline

$baselinePos = $bbt[GDBB_BOTTOM] - $tmpBaseline;

ImageDestroy($tmpImage);

$this->yText[$index] = $this->marginT + $this->textAreaHeight -

($this->textAreaHeight - $this->textHeight) / 2 - $baselinePos + 0.5;

}

else

{

// Actually, we want to center the x-height, ie. to keep the baseline at same pos.

// whatever the text is really, ie. independantly of ascenders and descenders.

// This provide better looking buttons, as they are more consistent.

$bbt = ImageTTFBBox($textSize, 0, $fontFile, "moxun");

$tmpHeight = $bbt[GDBB_BOTTOM] - $bbt[GDBB_TOP];

$this->yText[$index] = $this->marginT + $this->textAreaHeight -

($this->textAreaHeight - $tmpHeight) / 2 + 0.5;

}

}

/**

* Add the text to the button.

*/

function DrawText()

{

for ($i = 0; $i < $this->lineNb; $i++)

{

// Increase slightly line height

$yText = $this->yText[$i] + $this->textHeight[$i] * 1.1 *

($i - ($this->lineNb - 1) / 2);

ImageTTFText($this->image, $this->textSize, 0,

$this->xText[$i], $yText, $this->color, FONT, $this->lines[$i]);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值