0

Ich habe mehrere Lösungen durchgespielt und finde keine schnelle, effiziente Möglichkeit, einem Bild mit IMagick dynamischen, mehrzeiligen Text/Beschriftung/Annotation hinzuzufügen.Wie fügt man einem Bild mit IMagick mehrzeiligen/autowrap, dynamischen Text mit einer maximalen Breite hinzu?

Das Skript würde JSON-Daten für mehrere Textbereiche auf ein Bild anwenden, und die Daten umfassen alle Schriftattribute: Strich, Farbe, Schlagschatten, Ausrichtung, X & Y-Position (für die obere linke Ecke), maximale Breite und Drehung.

Ich habe mehrere Methoden der Annotation und Beschriftungen ausprobiert und kann einfach nicht den Text zu verhalten. Hier ist, was ich möchte in der Lage sein zu tun: enter image description here

Und hier ist mein Code so weit:

$data = '{ 
    "baseImage" : "test-image.jpg", 
    "fields" : [ 
     { 
      "name" : "name", 
      "default" : "You" 
     }, 
     { 
      "name" : "email", 
      "default" : "[email protected]" 
     } 
    ], 
    "textareas": [ 
     { 
      "font": "Alpha-Echo", 
      "align" : "left", 
      "size" : 24, 
      "color" : "#990000", 
      "stroke" : { 
       "color" : "#000000", 
       "width" : 0 
      }, 
      "shadow" : { 
       "x" : 2, 
       "y" : 2, 
       "blur" : 6, 
       "color" : "#000000", 
       "opacity" : 0.5 
      }, 
      "width" : 400, 
      "rotation" : 0, 
      "x" : 10, 
      "y" : 10, 
      "text" : "Welcome, {name}! How are you doing today?" 
     } 
    ] 
}'; 

$json = json_decode($data); 
$imgBase->setBackgroundColor(new ImagickPixel('transparent')); 
$imgBase->readImage($json->baseImage); 
$imgBase->setImageFormat('png'); 

// get image dimensions 
$w = $imgBase->getImageWidth(); 
$h = $imgBase->getImageHeight(); 

// loop through the textareas and fields 
foreach($json->textareas as $textarea){ 

    $captionHeight = $h - $textarea->y; 

    $drawText = $textarea->text; 

    foreach($json->fields as $field){ 
     $fieldText = (!empty($_GET[$field->name]))? $_GET[$field->name] : $field->default; 
     $drawText = str_replace ('{' . $field->name . '}' , $fieldText , $drawText); 
    } 

    // create the caption 
    $theText = new Imagick(); 
    $theText->newImage($textarea->width, $captionHeight, new ImagickPixel('transparent')); 

    $draw = new ImagickDraw(); 
    if($textarea->stroke->width > 0){ 
     $draw->setStrokeOpacity(1); 
     $draw->setStrokeColor($textarea->stroke->color); 
     $draw->setStrokeWidth($textarea->stroke->width); 
     $draw->setStrokeAntialias(true); 
    } 
    $draw->setGravity(1); // NORTH 
    $draw->setTextAlignment($alignment[$textarea->align]); // left = 1, center = 2, right = 3 
    $draw->setTextAntialias(true); 
    $draw->setFont($textarea->font); 
    $draw->setFontSize($textarea->size); 
    $draw->setFillColor($textarea->color); 
    $draw->rotate($textarea->rotation); 

    $draw->annotation($textarea->x, $textarea->y, $drawText); 
    $imgBase->drawImage($draw); 
} 
echo $imgBase->getImageBlob(); 

Die Fragen, die ich habe sind

  1. autowrapping Text
  2. keeping es bis zu einer maximalen Breite
  3. Positionierung (Zentrierung bringt den Text nach oben und nach links im Gegensatz zu horizontal zentriert Text usw.)

Ich nehme an, es kann getan werden - es ist in der Befehlszeilenversion von ImageMagick (http://www.imagemagick.org/Usage/text/#caption_bestfit) verfügbar, aber IMagick ist eine andere Geschichte. Jede Hilfe wird sehr geschätzt!

Antwort

0

Dies ist eher ein Kommentar als eine Antwort, aber lief lange.

Wenn Sie bereits eine neue temporäre Imagick-Instanz mit aufrufen, folgen Sie dann einfach der Beschriftung Bestfit-Technik, und das resultierende Bild wird über das Basisbild zusammengesetzt (nicht gezeichnet)?

$theText = new Imagick(); 
// Apply all font attributes. 
... // omitted 
// Create a `caption:` pseudo image that only manages text. 
$theText->newPseudoImage($textarea->width, 
         $imgBase->height, 
         'caption:'.$textarea->text); 
// Remove extra height. 
$theText->trimImage(0.0); 
// Compiste bestfit caption over base image. 
$imgBase->compositeImage($theText, 
         Imagick::COMPOSITE_ATOP, 
         $textarea->x, 
         $textarea->y); 
+0

Großartig, danke! Ich sah die ImageMagick Conversion Kommandozeilen-Informationen auf Bildunterschriften, aber die IMagick Handbuch hat sehr wenig - wenn überhaupt - Dokumentation über PseudoImage, Beschriftungen, etc. Schnelle Frage - mit der PseudoImage und Beschriftung, gibt es eine Möglichkeit zur Textausrichtung (rechts, links, Mitte)? Danke nochmal! –

+0

Ich denke, ich sollte auch fragen - in einem PseudoImage mit einer Beschriftung, gibt es eine Möglichkeit, Schriftart, Schriftfarbe, Strich und möglicherweise Schlagschatten zu setzen? Deshalb habe ich versucht, drawImage zu verwenden –

Verwandte Themen