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 — Bir PostScript Type1 yazı tipi ile yazılan bir metnin çerçevesini döndürür
Açıklama
$metin
, resource $yazıtipi
, int $boyut
)$metin
, resource $yazıtipi
, int $boyut
, int $boşluk
, int $sıkışıklık
, float $açı
)Bir PostScript Type1 yazı tipi ile yazılan bir metnin çerçevesini döndürür.
Metin çerçevesi yazı tipi dosyasında bulunan karakter ölçüleri kullanılarak hesaplanır. Ne yazık ki, hesaplanan değer metin resimde çizildiği zaman elde edilen boyutta olmaz. 0 derece açı ile çizilen bir metne her yönde birer pikselden daha fazla yer ayırmalısınız.
Değiştirgeler
-
metin -
Resme yazılacak metin.
-
yazıtipi -
imagepsloadfont() tarafından döndürülen bir yazı tipi özkaynağı.
-
boyut -
Piksel olarak yazı tipi yüksekliği.
-
boşluk -
Bir yazı tipi içindeki bir boşluğun öntanımlı değerini belirtmek için kullanılır. Bu miktar normal değere eklenir ve negatif olabilir. Bir em karenin binde birine eşit karakter boşluk birimi cinsinden belirtilir.
-
sıkışıklık -
Karakterler arasındaki boşluk miktarını belirtmek için kullanılır. Bu miktar normal karakter genişliğine eklenir ve negatif olabilir. Bir em karenin binde birine eşit karakter boşluk birimi cinsinden belirtilir.
-
açı -
Derece olarak açı.
Dönen Değerler
Aşağıdaki elemanlardan oluşan bir dizi döner:
| 0 | Sol kenarın X konumu |
| 1 | Üst kenarın Y konumu |
| 2 | Sağ kenarın X konumu |
| 3 | Alt kenarın Y konumu |
Örnekler
Örnek 1 - imagepsbbox() örneği
<?php
// Bir resim taslağı oluşturalım
$im = imagecreatetruecolor(200, 200);
// Renkleri ayarlayalım
$siyah = imagecolorallocate($im, 0, 0, 0);
$beyaz = imagecolorallocate($im, 255, 255, 255);
// PostScript yazı tipini yükleyelim
$font = imagepsloadfont('font.pfm');
// Metnin çerçevesini hesaplatalım
$bbox = imagepsbbox('Sample text is simple', $font, 12);
// Metnin X ve Y konumlarını belirtelim
$x = ($bbox[2] / 2) - 10;
$y = ($bbox[3] / 2) - 10;
// Metni resme yazalım
imagepstext($im, 'Basit bir örnek metin', $font, 12, $siyah, $beyaz, $x, $y);
// Resmi çıktılayıp belleği serbest bırakalım
header('Content-type: image/png');
imagepng($im);
imagedestroy($im);
?>
Notlar
Bilginize: Bu işlev sadece, PHP, --with-t1lib[=DİZİN] seçeneği ile derlenmişse kullanılabilir.
Ayrıca Bakınız
- imagepstext() - PostScript Type1 yazı tiplerini kullanarak bir resmin üzerine bir metin çizer
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;
}
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.
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 );
?>
