in my code below, there is an error!
replace
$w += abs($bb[3])-abs($bb[1]); // accumulate width
with
$w += abs($bb[2])-abs($bb[0]); // accumulate width
also after
$bb = imagepsbbox($c, $font, $size); // calculate width
you can add this line because spaces make odd values...
if ($c == ' ' ) $bb = imagepsbbox('i', $font, $size);
imagepsbbox
(PHP 4, PHP 5)
imagepsbbox — Retourne le rectangle entourant un texte et dessiné avec une police PostScript Type1
Description
Retourne le rectangle entourant un texte et dessiné avec une police PostScript Type1.
Le rectangle entourant est calculé en utilisant les informations disponibles sur les tailles de caractères, et, malheureusement, il a tendance à être légèrement différent du résultat réel final. Si l'angle est de 0 degré, vous pouvez-vous attendre à avoir besoin d'un rectangle d'au moins un pixel plus grand dans toutes les directions.
Liste de paramètres
- text
-
- font
-
Peut être 1, 2, 3, 4, 5 pour les polices internes d'encodage Latin2 (où les plus grands nombres correspondent aux polices larges) ou n'importe quels identifiants de police de votre choix, enregistrées avec la fonction imageloadfont().
- size
-
size est exprimé en pixels.
- space
-
permet de changer la valeur par défaut du caractère espace. Cette valeur est ajoutée lors des dessins et, donc, peut être négative. Exprimé en unité d'espacement de caractères, avec 1 unité vaut 1/1000 d'un em carré (un em : unité de mesure représentée par un carré dont la dimension horizontale est la même que le corps du caractère).
- tightness
-
tightness permet de contrôler la quantité d'espace entre les caractères. Cette quantité est ajoutée lors des dessins, et peut donc être négative. Exprimé en unité d'espacement de caractères, avec 1 unité vaut 1/1000 d'un em carré.
- angle
-
angle est exprimé en pixels.
Valeurs de retour
Retourne un tableau contenant les éléments suivants :
| 0 | Abscisse gauche |
| 1 | Ordonnée supérieure |
| 2 | Abscisse droite |
| 3 | Ordonnée inférieure |
Notes
Note: Cette fonction n'est disponible que si PHP est compilé en utilisant --enable-t1lib[=DIR].
imagepsbbox
05-May-2008 09:32
05-May-2008 08:34
I have a given image width and need to render a long string on that image. By using the following function I'm, able to get an array of strings which each will fit into the images width. It might need a lot of CPU time, but it's cool:
// Function to return an Array of Strings
// Arguments: String to be wrapped, maximum width in pixels of each line, font and fontsize
function imgwordwrap($s, $maxWidth, $font, $size) {
// Make an empty ArrayList
$a = array();
$w = 0; // Accumulate width of chars
$i = 0; // Count through chars
$rememberSpace = 0; // Remember where the last space was
// As long as we are not at the end of the String
while ($i < strlen($s)) {
// Current char
$c = substr($s, $i, 1);
$bb = imagepsbbox($c, $font, $size); // calculate width
$w += abs($bb[3])-abs($bb[1]); // accumulate width
if ($c == ' ') $rememberSpace = $i; // Are we a blank space?
if ($w > $maxWidth) { // Have we reached the end of a line?
$sub = substr($s,0,$rememberSpace); // Make a substring
// Chop off space at beginning
if (substr($sub,0,1)==' ') $sub = substr($sub,1);
// Add substring to the array
$a[] = $sub;
// Reset everything
$s = substr($s,$rememberSpace);
$i = 0;
$w = 0;
}
else {
$i++; // Keep going!
}
}
// Take care of the last remaining line
trim($s);
if (substr($s,0,1)==' ') $s = substr($s,1);
$a[] = $s;
return $a;
}
23-Oct-2006 02:25
When using imagepsbbox, keep in mind, that meaning of y-coordinates is slightly different here. Y-coordinates returned by this function are related to the baseline of the text starting at point [0,0]. Positive values represent points ABOVE the baseline, negative values represent points BELOW the baseline. That is why the lower left y-coordinate is always smaller here than the upper right y-coordinate (these two coordinates are actualy values of metrics.descent and metrics.ascent - see T1Lib docs).
So when you want to place some text using coordinates of the top left corner (for example [100,100]), use this:
<?php
$x = 100;
$y = 100;
$text = "Dodge this";
$fontsize=18;
$font=imagepsloadfont("somefont.pfb");
list($lx,$ly,$rx,$ry) = imagepsbbox($text,$font,$fontsize);
imagepstext ($someimage, $text, $font, $fontsize, $somecolor, $somecolor, $x, $y + $ry);
?>
Hope it helps someone, I got stuck with this for a while.
17-Apr-2002 09:23
When using imagepsbbox, you are probably trying to do something like creating a button with text, so that the button is large enough for the text...
Below is a very simple example of making a black button just big enough to display white text on it.
<?php
//if text is no variable set sample text
if (!$text)
$text = "This is a sample text";
// set the font size
$fontsize=14;
// load the font to use
$font=ImagePsLoadFont("/fonts/ariam___.pfb");
//get the left lower corner and the right upper
list($lx,$ly,$rx,$ry) = imagepsbbox($text,$font,$fontsize,0,0,0);
// calculate the size of the text
$textwidth = $rx - $lx;
$textheight = $ry - $ly;
// make an image 40 pixels wider and 20 pixels higher than the text
$imh = $textheight + 20;
$imw = $textwidth + 40;
$im = imageCreate( $imw, $imh );
//define colors, first color is used as background color!
$black = ImageColorAllocate ($im, 0, 0, 0);
$white = ImageColorAllocate ($im, 255, 255, 255);
//create the text (with the same parameters as imagepsbbox!)
ImagePSText ($im, "$text", $font, $fontsize, $white, $white, 20, 20,'','','',4);
//send the header
header("Content-type: image/jpeg");
// create the image
ImageJPEG ($im,"",100);
//destroy the image & font to free memory
Imagepsfreefont ( $font );
ImageDestroy ( $im );
?>
