• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • imageftbbox()

    (PHP 4 >= 4.0.7, PHP 5, PHP 7)

    给出一个使用 FreeType 2 字体的文本框

    说明

    imageftbbox(float $size,float $angle,string $fontfile,string $text[,array $extrainfo]): array

    This function calculates and returns the bounding box in pixels for a FreeType text.

    参数

    $size

    字体的尺寸。根据 GD 的版本,为像素尺寸(GD1)或点(磅)尺寸(GD2)。

    $angle

    Angle in degrees in which$textwill be measured.

    $fontfile

    The name of the TrueType font file(can be a URL). Depending on which version of the GD library that PHP is using, it may attempt to search for files that do not begin with a leading '/' by appending '.ttf' to the filename and searching along a library-defined font path.

    $text

    The string to be measured.

    $extrainfo
    Possible array indexes for$extrainfo
    KeyTypeMeaning
    linespacingfloatDefines drawing linespacing

    返回值

    imageftbbox() returns an array with 8 elements representing four points making the bounding box of the text:

    0lower left corner, X position
    1lower left corner, Y position
    2lower right corner, X position
    3lower right corner, Y position
    4upper right corner, X position
    5upper right corner, Y position
    6upper left corner, X position
    7upper left corner, Y position

    The points are relative to thetextregardless of the$angle, so "upper left" means in the top left-hand corner seeing the text horizontally.

    范例

    imageftbbox() example

    <?php
    // Create a 300x150 image
    $im = imagecreatetruecolor(300, 150);
    $black = imagecolorallocate($im, 0, 0, 0);
    $white = imagecolorallocate($im, 255, 255, 255);
    // Set the background to be white
    imagefilledrectangle($im, 0, 0, 299, 299, $white);
    // Path to our font file
    $font = './arial.ttf';
    // First we create our bounding box
    $bbox = imageftbbox(10, 0, $font, 'The PHP Documentation Group');
    // This is our cordinates for X and Y
    $x = $bbox[0] + (imagesx($im) / 2) - ($bbox[4] / 2) - 5;
    $y = $bbox[1] + (imagesy($im) / 2) - ($bbox[5] / 2) - 5;
    imagefttext($im, 10, 0, $x, $y, $black, $font, 'The PHP Documentation Group');
    // Output to browser
    header('Content-Type: image/png');
    imagepng($im);
    imagedestroy($im);
    ?>
    

    注释

    Note:此函数需要 GD 2.0.1 或更高版本(推荐 2.0.28 及更高版本)。

    Note:此函数仅在PHP 编译时加入 freetype 支持时有效(--with-freetype-dir=DIR)。

    更新日志

    版本说明
    4.3.5$extrainfowas made optional.
    imagettfbbox() returns an array with 8 elements representing four points making the bounding box of the text: 
    0 lower left corner, X position 
    1 lower left corner, Y position 
    2 lower right corner, X position 
    3 lower right corner, Y position 
    4 upper right corner, X position 
    5 upper right corner, Y position 
    6 upper left corner, X position 
    7 upper left corner, Y position 
    The points are relative to the text regardless of the angle, so "upper left" means in the top left-hand corner seeing the text horizontally.
    Here is a handy example I used to center "dynamic text" onto an image. 
    Ex. Say you want to center a clients IP Address onto a picture. 
    $ip=$_SERVER['REMOTE_ADDR'];  
    $details = imageftbbox($fontsize, 0, $font, $ip, array("linespacing" => 1));
    $xcoord = ($imgwidth - $details[4]) / 2; // this will return the x coordinate centered to your specific image. Make sure you set $imgwidth to the width of the image you are using.   
    imagettftext($image, $fontsize, 0, $xcoord, $ycoord, $fontcolor, $font, $ip);
    This function can be used to generate right-aligned text. Just work out how wide the text image is and position it accordingly. Example:
    $i_width = 200;
    $i_height = 40;
    $string = "Hello World!";
    $pointsize = 10;
    $fontfile = "/usr/local/lib/ttf/Helve.ttf";
    $im = imagecreate($i_width, $i_height);
    $black = imagecolorallocate ($im, 0, 0, 0);
    $white = imagecolorallocate ($im, 255, 255, 255);
    $string_size = ImageFtBbox($pointsize, 0, $fontfile, $string, array("linespacing" => 1));
    $s_width = $string_size[4];
    $s_height = $string_size[5];
    ImageFtText($im, $pointsize, 0, $i_width - $s_width - 1, 0 - $s_height, $white, $fontfile, $string, array("linespacing" => 1));
    Header ("Content-type: image/png");
    ImagePNG ($im);
    ImageDestroy ($im);
    //EXAMPLE - Center text
    function newText($im, $size, $angle= 0, $x, $y, $color, $font, $text,$align = "left",$border=false,$width=0,$height=0){
      
      if($align == "center")
      {
        if ($border == true ){
          imagerectangle($im, $x, $y, $x +$width, $y + $height, $color);
        }
        $bbox = imageftbbox($size, 0, $font, $text);
        // Marcamos el ancho y alto
        $s_width = $bbox[4];
        $s_height = $bbox[5]; 
        
        $y = $y + ($height-$s_height)/2;
        $x = $x + ($width-$s_width)/2;
      }
       
      imagettftext($im, $size, $angle, $x, $y, $color, $font, $text);
    }
    ah... the problem between imageftbbox() and imagefttext() lies in the mirroring of the y-axes.
    Below you see, for a font-size 16 the boudingboxes of "b", "p" and "bp":
    < b: w=9 h=15
    b(0,-1)
    b(9,-1)
    b(9,-16)
    b(0,-16)
    < p: w=9 h=16
    p(0,4)
    p(9,4)
    p(9,-12)
    p(0,-12)
    < bp: w=20 h=20
    bp(0,4)
    bp(20,4)
    bp(20,-16)
    bp(0,-16)
    If drawing "bp" using imagefttext() at y=0, the the top of "bp" indeed is at y=-16, and the bottom of "bp" at y=4. (Plus or minus a pixel here and there, because at y=0 there actually is a vissible pixel.)
    i've found a work around for this situation
    it seems that height is directly proportional to line spacing so you just have to apply the same factor to image height
    for example :
    $spacing = 0.7;
    $params = array("linespacing" => $spacing);
    $box = imageftbbox ($size, 0, $font, $text, $params);
    $tw=$box[4]-$box[0]; //image width
    $th=($box[1]-$box[5])*$spacing; //image height
    ImageFTBBox returns a bounding box, not metrics, as some (most?) of the notes above seem to assume. The 8 values it returns specify the 4 corners of this bounding box. So to properly determine the width and height of a string you need to do:
    $bbox = ImageFTBBox(...);
    $width = abs($bbox[0]) + abs($bbox[2]); // distance from left to right
    $height = abs($bbox[1]) + abs($bbox[5]); // distance from top to bottom
    For alignment i used this method:
    if($align == "center" || $align == "right")
      {
        $verticaltxtspace = $backwidth - (2 * $posx);    
        $spacepositions = imagettfbbox($size, $angle, "fonts/verdanaz.ttf", " ");     
        $spacepx = $spacepositions[4] - $spacepositions[0];    
        
        // Split text in lines
        $lines = split("[\r][\n]", $text);    
        for($count = 0; $count < count($lines); $count++)
        {
          $textpositions = imagettfbbox($size, $angle, "fonts/verdanaz.ttf", $lines[$count]);      
          $textpx = $textpositions[2] - $textpositions[0];
          
          if($align == "right")
          {
            $spaces = ($verticaltxtspace - $textpx) / $spacepx;
          }
          else if($align == "center")
          {
            $spaces = (($verticaltxtspace - $textpx)/2) / $spacepx;
          }
          
          // Add spaces
          $line = $lines[$count];
          for($i = 0; $i < $spaces; $i++)
          {
            $line = " " . $line;
          }
          $lines[$count] = $line;
        }
        
        // Create new text of lines
        $text = "";
        for($count = 0; $count < count($lines); $count++)
        {
          $text .= $lines[$count] . "\r\n";
        }    
      }
      
        
      //  Draw the shadow text on de shadow
      imagettftext($background, $size, $angle, $posx, $posy, $textcolor, "fonts/verdanaz.ttf", $text);

    上篇:imagefontwidth()

    下篇:imagefttext()