【问题标题】:can I have multiline text with GD and PHP?我可以使用 GD 和 PHP 多行文本吗?
【发布时间】:2011-02-26 10:40:13
【问题描述】:

我正在尝试使用 GD+PHP 输出多行文本,但无法正常工作。我的php知识真的很基础。 这是代码,关于如何输出 2 或 3 行文本的任何想法?

$theText = (isset($_GET['caption']))? stripslashes($_GET['caption']) :'';
imagettftext($baseImage, $textSize, $textAngle, $textXposition, $textYposition, $textColor, $fontName, $theText);

【问题讨论】:

    标签: php text gd multiline


    【解决方案1】:
    imagettftext($baseImage, $textSize, $textAngle, $textXposition, $textYposition, $textColor, $fontName, $theText);
    imagettftext($baseImage, $textSize, $textAngle, $textXposition+(25), $textYposition, $textColor, $fontName, $theText);
    imagettftext($baseImage, $textSize, $textAngle, $textXposition+(50), $textYposition, $textColor, $fontName, $theText);
    

    您必须添加 x 像素才能将其向下移动到 X 位置。请记住,您的整个图像应该足够高和足够宽以适合文本。

    【讨论】:

    • 谢谢!有没有办法自动将它分成几行?例如计算单词或图像的宽度?
    • 嗯,这是一个问题,因为 ttf 字体中每个字符的宽度差异很大。一个不像 ttf 字体那么花哨但大部分都足够好的解决方案是普通的像素字体。我前段时间为它写了一个脚本,你可以在这里找到:gist.github.com/421165 只需阅读它你就会明白它 - 它不是很难 - 它也不是很干净或写得很好......;)你只是通过它文本和图像的宽度 - 它会完成其余的工作。玩得开心! :)
    • 有适当的函数来获取“文本”的“边界框”,你可以使用它们。要拆分,请使用split;要了解“边界框”,请使用 imagettfbbox... 如果您已经阅读了我在回答中提供的链接,您会看到一些建议您如何操作的示例。
    【解决方案2】:

    API 不支持。 这是“手动”执行的代码:

    http://php.net/manual/en/function.imagettftext.php#75718

    【讨论】:

    • 好的,这是一个开始!我将尝试解决此链接中的代码。谢谢!
    【解决方案3】:

    您可以每行重复一个 imagettftext;只需将$theText 拆分为一个数组(分隔符是NewLine)并循环遍历数组中的每个元素,将$textYposition 增加行的高度(参见$textSize,但实际上使用@987654325 会更好@.Read the page in the PHP manual

    【讨论】:

      【解决方案4】:

      我有一个未知长度的字符串,但只能使用一定的宽度。所以我想出了这个。基本上它将句子拆分为字符。如果碰到空格,则检查是否可以将单词添加到前一行,如果不能,则开始新行。超长的词也有蹩脚的安全,只是被砍了,以免走出形象。​​

      在我实际将文本打印到图像的阶段,我检查该行是否小于允许的最大字符数并添加前导 + 尾随空格,以模仿 text-align: center。

      #  Split up the lines
          $arrMessage = str_split(stripcslashes($strMessage));
          $arrTemp = array();
          $line = 0;
          $word = array();
          $arrTemp[$line] = array();
      
          foreach($arrMessage as $char){
      
              //if we hit a space, see if we should continue line, or make a new line
              if($char == " ")
              {
                  //calculate numbers of chars currently on line + number of chars in word
                  $numTotalChars = (int) count($word) + (int) count($arrTemp[$line]);
      
                  //if total > 14 chars on a line, create new line
                  if($numTotalChars > 14)
                  {                   
                      $line++;
                      $arrTemp[$line] = array();
      
                  }
                  $word[] = $char;
                  //push word-array onto line + empty word array
                  $arrTemp[$line] = array_merge($arrTemp[$line], $word);
                  $word = array();
      
              }
              else
              {
             //if word is too long for a line, split it 
                  if( count($word) > 16)
                  {
                      $numTotalChars = (int) count($word) + (int) count($arrTemp[$line]);
      
                      if($numTotalChars > 16)
                      {                   
                          $line++;
                          $arrTemp[$line] = array();
      
                      }
      
                      $arrTemp[$line] = array_merge($arrTemp[$line], $word);
                      $word = array();
      
                  }
      
                  $word[] = $char;
      
              }
          }
      

      不要忘记在一行中添加最后一个单词。您还需要检查它是否应该在新行上。

      向图像添加线条:

      //add some px to x and y for every new line
          $pos_x = $font->position[0];
          $pos_y = $font->position[1];
      
          $numLineHeight = 20;
      
          $addToX = 0;
      
          if($font->angle > 5)
          {
              $addToX = 2;
          }
          else if($font->angle < 0)
          {
              $addToX = -2;
          }
      
      #   ADD MESSAGE
          foreach($arrTemp as $arrLine){
      
              //leading/trailing whitespace (==center text)
              $numCharsOnThisLine = count($arrLine);          
              $extraWhiteSpace = 14 - $numCharsOnThisLine;
              $frontBackSpace = floor($extraWhiteSpace / 2);
      
              for($i = 0; $i < $frontBackSpace; $i++){
                  array_unshift($arrLine, " ");
                  $arrLine[] = " ";
              }
          //make string from char array
              $strLine = implode("", $arrLine);
      
              imagettftext ($image, $font->size, $font->angle, $pos_x, $pos_y, $tlt, $font->family, $strLine);
              $pos_x = $pos_x + $addToX;
              $pos_y = $pos_y + $numLineHeight;
          }
      

      【讨论】:

        【解决方案5】:

        我的两分钱... (由于需要多行文本,所以在循环中添加文本)

        <?php
        
        error_reporting(E_ALL);
        error_reporting(-1);
        ini_set('error_reporting', E_ALL);
        
        /*
           construction of the tcp scan
           I would prefer building a C C.G.I.
           but let's experiment with php
           (apache user rights over nmap resources)
        
           no php ressources on google website,
           noor ajax call (worker) other then 'self'
           
           so
           
           I will use a php trick into the <img> html tag.
           (<img src="mysite.com/gdtrick.php">)
        
           I'm wondering if I can do the same with, let's say,
           gdtrick.cgi... that would be so cool.
        
        
        */
        // size of the image to create
        
        $x = 300;
        $y = 300;
        
        
        $displacement_y = 24;
        
        //debug
        //$zetext = "test";
        
        
        $image = imagecreate($x,$y);
        
        $white = imagecolorallocate($image, 255,255,255);
        $black = imagecolorallocate($image, 0,0,0);
        
        $zeipaddr = "";
        $zetext = "";
        
        function getUserIP() {
            $ipaddress = '';
            if (isset($_SERVER['HTTP_CLIENT_IP']))
                $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
            else if(isset($_SERVER['HTTP_X_FORWARDED_FOR']))
                $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
            else if(isset($_SERVER['HTTP_X_FORWARDED']))
                $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
            else if(isset($_SERVER['HTTP_X_CLUSTER_CLIENT_IP']))
                $ipaddress = $_SERVER['HTTP_X_CLUSTER_CLIENT_IP'];
            else if(isset($_SERVER['HTTP_FORWARDED_FOR']))
                $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
            else if(isset($_SERVER['HTTP_FORWARDED']))
                $ipaddress = $_SERVER['HTTP_FORWARDED'];
            else if(isset($_SERVER['REMOTE_ADDR']))
                $ipaddress = $_SERVER['REMOTE_ADDR'];
            else
                $ipaddress = 'UNKNOWN';
            return $ipaddress;
        }
        
        $zeipaddr = getUserIP();
        
        //for debug
        //echo "IP: " .$zeipaddr."<br>\n";
        //$zeipaddr = "192.168.1.18";
        
        
        $ports = array(21, 22, 23, 80, 8080, 8081, 8082, 5900, 5901, 5902, 3306, 6000, 6001, 6002, 6003);
        
        //$ports = array(80);
        
        $text1 = imagettftext($image, 12, 0, 12, $displacement_y, $black, "/usr/share/fonts/truetype/freefont/FreeSans.ttf", "PHP SCAN ON DEMAND");
        $displacement_y += 12;
        
        
        foreach ($ports as $port)
        {
            $connection = @fsockopen($zeipadrr, $port, $errno, $errstr, 1);
        
            if (is_resource($connection))
            {
                $zetext = $zeipadrr . ':' . $port . ' ' . '(' . getservbyport($port, 'tcp') . ') is open.' ;
                
        
                $text1 = imagettftext($image, 10, 0, 6, $displacement_y, $black, "/usr/share/fonts/truetype/freefont/FreeSans.ttf", $zetext);
        
                fclose($connection);
            }
        
            else
            {
                $zetext = $zeipaddr . ':' . $port . " not active." ;
                
                $text1 = imagettftext($image, 10, 0, 6, $displacement_y, $black, "/usr/share/fonts/truetype/freefont/FreeSans.ttf", $zetext);
        
            }
            
            $displacement_y += 16; 
        }
        
        $displacement_y += 12; 
        
        $text1 = imagettftext($image, 12, 0, 12, $displacement_y, $black, "/usr/share/fonts/truetype/freefont/FreeSans.ttf", "Port scanning done !!!");
        
        
        header('Content-Type: image/jpeg');
        imagejpeg($image);
        
        
        ?>
        

        【讨论】:

          猜你喜欢
          • 2010-09-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-12
          • 1970-01-01
          • 2010-10-02
          相关资源
          最近更新 更多