How can I wrap text using Imagick in PHP so that it is drawn as multiline text?

前端 未结 5 1503
悲哀的现实
悲哀的现实 2020-12-05 16:54

The Imagick library in PHP allows you to draw text on top of an image.

How can I tell Imagick to wrap the text based upon some bounded text box, so that the words ap

5条回答
  •  生来不讨喜
    2020-12-05 17:15

    Usage:

    list($lines, $lineHeight) = wordWrapAnnotation($image, $draw, $msg, 140);
    for($i = 0; $i < count($lines); $i++)
        $image->annotateImage($draw, $xpos, $ypos + $i*$lineHeight, 0, $lines[$i]);
    

    Function:

    /* Implement word wrapping... Ughhh... why is this NOT done for me!!!
        OK... I know the algorithm sucks at efficiency, but it's for short messages, okay?
    
        Make sure to set the font on the ImagickDraw Object first!
        @param image the Imagick Image Object
        @param draw the ImagickDraw Object
        @param text the text you want to wrap
        @param maxWidth the maximum width in pixels for your wrapped "virtual" text box
        @return an array of lines and line heights
    */
    function wordWrapAnnotation(&$image, &$draw, $text, $maxWidth)
    {
        $words = explode(" ", $text);
        $lines = array();
        $i = 0;
        $lineHeight = 0;
        while($i < count($words) )
        {
            $currentLine = $words[$i];
            if($i+1 >= count($words))
            {
                $lines[] = $currentLine;
                break;
            }
            //Check to see if we can add another word to this line
            $metrics = $image->queryFontMetrics($draw, $currentLine . ' ' . $words[$i+1]);
            while($metrics['textWidth'] <= $maxWidth)
            {
                //If so, do it and keep doing it!
                $currentLine .= ' ' . $words[++$i];
                if($i+1 >= count($words))
                    break;
                $metrics = $image->queryFontMetrics($draw, $currentLine . ' ' . $words[$i+1]);
            }
            //We can't add the next word to this line, so loop to the next line
            $lines[] = $currentLine;
            $i++;
            //Finally, update line height
            if($metrics['textHeight'] > $lineHeight)
                $lineHeight = $metrics['textHeight'];
        }
        return array($lines, $lineHeight);
    }
    

提交回复
热议问题