2011-08-28 3 views
3

Je souhaite dessiner un rectangle avec deux chaînes. Je veux que la première chaîne soit de taille 15pt (c'est un nombre), la seconde est de taille 10pt (l'étiquette). Il est facile de dessiner seule chaîne avec une taille au rectangle, je le fais comme ceci:ImageMagick: comment dessiner deux chaînes de taille différente sur l'image?

$image = new Imagick('someimage.png'); 
$draw = new ImagickDraw; 
$draw->setGravity(Imagick::GRAVITY_CENTER); 
$draw->setfont(__DIR__ . DS . 'TREBUCBD.TTF'); 
$draw->setfontsize(15); 
$draw->annotation(0, 0, '50 points'); 
$image->drawImage($draw); 

L'idée ici est d'avoir « 50 » dans « 50 points » pour être grand.

J'ai essayé de faire un $ draw-> push() pour pousser les paramètres actuels vers la pile, puis redéfinir la taille de la police et l'annotation, mais les deux chaînes se chevauchent. J'ai essayé de faire ça pendant des heures. Toute aide est très appréciée!

L'implémentation ci-dessus est en PHP mais probablement j'arriverai à le faire même par l'exemple qui l'affiche avec l'utilisation ImageMagick en ligne de commande.

edit: J'ai commencé une prime que je vais récompenser pour une solution implémentée en PHP.

+0

Que diriez-vous http://www.php.net/manual/en/function.imagick-annotateimage .php? On dirait que c'est ce que tu veux. Il y a aussi un exemple complet sur la page. – DrColossos

+0

DrColossos, qui produit le même résultat - il produirait une chaîne de texte avec une police et une taille données mais je veux qu'une partie de cette chaîne soit plus grande que le reste et dans le même temps les deux parties soient centrées comme si elles étaient . – ddinchev

Répondre

2

Ajouter assez d'espace avant « points » et après le « 50 » afin de les aligner bien:

<?php 
$image = new Imagick('test.png'); 
$draw = new ImagickDraw; 
$draw->setGravity(Imagick::GRAVITY_CENTER); 
$draw->setfontsize(30); 
$draw->annotation(0, 0, '50   '); 
$image->drawImage($draw); 

$draw = new ImagickDraw; 
$draw->setGravity(Imagick::GRAVITY_CENTER); 
$draw->setfontsize(15); 
$draw->annotation(0, 0, '  points'); 
$image->drawImage($draw); 

file_put_contents('test.png', $image->getImageBlob()); 
?> 
+0

Ceci est une solution, je les fais chevaucher et écrire. en même temps je dois à nouveau "calculer" combien d'espaces avoir. – ddinchev

4

Vous pouvez utiliser +append option pour faire deux étiquettes de texte différents joints horizontalement (-append - verticalement):

convert -background grey -pointsize 15 -fill black label:abc \ 
     -pointsize 10 -fill red label:cdefgh -gravity South +append test.png 

Ce code produit en fait deux images dimensionnées exactement à adapter la police (car il n'y a pas de taille explicite spécifié), puis ces deux images sont ajoutées horizontalement ensemble:

enter image description here

encore une fois: la taille de cette image est calculée automatiquement en fonction de vos étiquettes. Vous pouvez utiliser les fonctions Imagick::labelImage et Imagick::appendImages pour y parvenir. (Pour créer une image sans arrière-plan, vous pouvez spécifier -backround transparent, par exemple via Imagick::setBackgroundColor)

Ensuite, l'image résultante avec les étiquettes peut être composée avec tout ce que vous voulez.

+0

C'est sympa, même si je ne peux pas trouver un moyen de le faire avec le wrapper PHP ImageMagick. – ddinchev

+0

'Imagick :: appendImages'? http://www.php.net/manual/fr/function.imagick-appendimages.php – moropus

+0

@Veseliq, 'Imagick :: appendImages' a-t-il fonctionné pour vous? – moropus

Questions connexes