略微加速

PHP官方手册 - 互联网笔记

PHP - Manual: ImagickDraw::annotation

2024-12-21

ImagickDraw::annotation

(PECL imagick 2, PECL imagick 3)

ImagickDraw::annotationDraws text on the image

说明

public ImagickDraw::annotation(float $x, float $y, string $text): bool
警告

本函数还未编写文档,仅有参数列表。

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

返回值

没有返回值。

add a noteadd a note

User Contributed Notes 4 notes

up
14
use_contact_form at Jonas-Kress dot de
12 years ago
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;
    }
?>
up
7
Anonymous
12 years ago
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);
?>
up
-1
Anonymous
12 years ago
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;
}
?>
up
-1
web at synaptech dot fr
8 years ago
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 );
?>

官方地址:https://www.php.net/manual/en/imagickdraw.annotation.php

北京半月雨文化科技有限公司.版权所有 京ICP备12026184号-3