ImageMagick根据框宽/高度自动选择字体大小

时间:2014-11-23 20:16:58

标签: automation imagemagick font-size imagick

enter image description here

enter image description here

我的图像区域为160像素×350像素我需要能够适应不同宽度的文本段落,并根据框中剩余的可用空间自动调整或缩小字体大小。

我认为这可以通过函数 Imagick :: queryFontMetrics()来实现,该函数返回估计的文本大小而不打印文本,如下面的数组 http://php.net/manual/en/imagick.queryfontmetrics.php

array (size=10)
  'characterWidth' => float 30
  'characterHeight' => float 30
  'ascender' => float 27
  'descender' => float -6
  'textWidth' => float 150
  'textHeight' => float 33
  'maxHorizontalAdvance' => float 60
  'boundingBox' => 
    array (size=4)
      'x1' => float 0
      'y1' => float 0
      'x2' => float 21.4375
      'y2' => float 22
  'originX' => float 151
  'originY' => float 0

我需要的是获取数据的公式,此功能提供最佳的字体大小以适应绿色框。

这是我到目前为止所得到的,但我坚持公式:

    $text_large = "Hello world Hello world";
    //$text_small = "Hello world Hello world Hello world Hello world Hello world";


    $img = new Imagick($path_to_image); //image 500 x 500
    $draw = new ImagickDraw();


    $draw->setFont("arial.ttf");
    $draw->setGravity(Imagick::GRAVITY_NORTHWEST);

    $draw->setFontSize(30); paragraph
    $fm = $img->queryFontMetrics($draw, $text_large, true);

    //this needs to be set automatically based on lenth of text
    $optimal_font_size = (160 / 2) - ($fm["textWidth"] / 2);



    $draw->setFontSize($optimal_font_size);
    $img->annotateImage($draw, 5, 50, null, $text_large);

    ...

1 个答案:

答案 0 :(得分:0)

简单的解决方案是昨天累了看。

$draw->setFontSize(15);
$metrics = $input_img->queryFontMetrics($draw, "Hello World Hello World Hello World", false);
$new_font_size = floor($metrics["characterWidth"] * 160 / $metrics["textWidth"]);
$draw->setFontSize($new_font_size);
$input_img->annotateImage($draw, 5, 50, null, "Hello World Hello World Hello World");