ImagickDraw::annotation()
(PECL imagick 2.0.0)
Draws text on the image
说明
ImagickDraw::annotation(float $x,float $y,string $text): bool
Warning本函数还未编写文档,仅有参数列表。
Draws text on the image.
参数
- $x
- The x coordinate where text is drawn 
- $y
- The y coordinate where text is drawn 
- $text
- The text to draw on the image 
返回值
没有返回值。
may help someone...
<?php
  /**
   * Split the given text into rows fitting the given maxWidth
   *
   * @param unknown_type $draw
   * @param unknown_type $text
   * @param unknown_type $maxWidth
   * @return array
   */
  private function getTextRows($draw, $text, $maxWidth)
  {    
    $words = explode(" ", $text);
    
    $lines = array();
    $i=0;
    while ($i < count($words)) 
    {//as long as there are words
      $line = "";
      do
      {//append words to line until the fit in size
        if($line != ""){
          $line .= " ";
        }
        $line .= $words[$i];
        
        
        $i++;
        if(($i) == count($words)){
          break;//last word -> break
        }
        
        //messure size of line + next word
        $linePreview = $line." ".$words[$i];
        $metrics = $this->canvas->queryFontMetrics($draw, $linePreview);
        //echo $line."($i)".$metrics["textWidth"].":".$maxWidth."<br>";
        
      }while($metrics["textWidth"] <= $maxWidth);
      
      //echo "<hr>".$line."<br>";
      $lines[] = $line;
    }
    
    //var_export($lines);
    return $lines;
  }
?>
Here's how to create a header image and write it to file. This took me a while to figure out. I hope this helps.
<?php
/* Text to write */
$text = "Hello World!";
/* Create Imagick objects */
$image = new Imagick();
$draw = new ImagickDraw();
$color = new ImagickPixel('#000000');
$background = new ImagickPixel('none'); // Transparent
/* Font properties */
$draw->setFont('Arial');
$draw->setFontSize(50);
$draw->setFillColor($color);
$draw->setStrokeAntialias(true);
$draw->setTextAntialias(true);
/* Get font metrics */
$metrics = $image->queryFontMetrics($draw, $text);
/* Create text */
$draw->annotation(0, $metrics['ascender'], $text);
/* Create image */
$image->newImage($metrics['textWidth'], $metrics['textHeight'], $background);
$image->setImageFormat('png');
$image->drawImage($draw);
/* Save image */
file_put_contents('/path/to/file.png', $image);
?>
In some cases the (custom) font can be truncated on the side parts, especially the handwritten ones. To improve the above note from Anonymous on "how to create a header image", I've changed this part of the code: <?php /* Create text */ $draw->annotation( $metrics['boundingBox']['y2'], $metrics['ascender'], $text ); /* Create image */ $image->newImage( $metrics['textWidth'] + $metrics['boundingBox']['y2'], $metrics['textHeight'], $background ); ?>
You can use this method to break your text so that it'll fit a certain $maxWidth.
<?php
/**
 * @param string $text
 * @param int $maxWidth
 */
protected function _fitText($text, $maxWidth)
{
  $im = new Imagick();
  $im->newImage($this->_width, $this->_height, "none");
  $lines = explode(PHP_EOL, trim($text));
  $DEBUG_LOOP = 0;
  for ($k = 0; $k < count($lines); ++$k) {
    do {
      $drawText = new ImagickDraw();
      // set your font settings like size, family, .. here
      $metrics = $im->queryFontMetrics($drawText, $lines[$k]);
      $fits   = $metrics["textWidth"] <= $maxWidth;
      if ($fits) {
        break;
      }
      $pos = mb_strrpos($lines[$k], " ");
      if ($pos === false) {
        throw new RuntimeException("can not make it fit");
      }
      if (!isset($lines[$k + 1])) {
        $lines[$k + 1] = null;
      }
      $lines[$k + 1] = trim(mb_substr($lines[$k], $pos + 1) . " " . $lines[$k + 1]);
      $lines[$k]   = trim(mb_substr($lines[$k], 0, $pos));
      if (++$DEBUG_LOOP >= 200) {
        throw new RuntimeException("infinite loop");
      }
    } while (!$fits);
  }
  $text   = implode(PHP_EOL, $lines);
  $drawText = new ImagickDraw();
  // set your font settings like size, family, .. here again!
  $metrics = $im->queryFontMetrics($drawText, $text);
  $metrics["text"] = $text;
  assert('$metrics["textWidth"] <= $maxWidth');
  return $metrics;
}
?>
