Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [GD] aree di testo imagettfbbox

    Ciao a tutti,
    Sto impazzendo nel creare delle immagini dinamiche con del testo che va a capo.

    Riesco a creare solo del testo continuo utilizzando imagettfbbox.
    Non è che avete qualche classe o script di esempio per fare quello che voglio io?

    Dovrei creare immagini 552px di larghezza e l'altezza dovrebbe variare a seconda della lunghezza del testo..

    Help
    MITTICCOOOOOOOOO!

  2. #2
    eheheheheh

    a te serve misurare la larghezza del testo

    ti posto uno spezzone di codice che spezza il testo su + righe (senza disegnarlo, il codice lo devi implementare tu) mantenendo le parole intere

    codice:
    function imagettftextwordwrap($image, $fontsize, $fontfile, $text, $color, $x, $y, $maxwidth)
    {
      $textRows = array();
      $textBoxSize = imagettfbbox($fontsize, 0, $fontfile, $text);
      
      if ($textBoxSize[3] - textBoxSize[1] <= $maxwidth)
      {
        $textRows[] = array($textBoxSize, $text);
      }
      else
      {
        $wordList = explode(' ', $text);
        $currentText = '';
        while(list(, $currentWord) = each($wordList))
        {
          $textBoxSize = imagettfbbox($fontsize, 0, $fontfile, $currentText . ' ' . $currentWord);
          
          if ($textBoxSize[3] - textBoxSize[1] > $maxwidth)
          {
            $textRows[] = array($textBoxSize, $text);
            $currentText = '';
          }
          else
          {
            $currentText .= ' ' . $currentWord;
          }
        }
        
        if ($currentText != '')
        {
          $textRows[] = array($textBoxSize, $text);
        }
        
        while(list($rowLine, $rowInfos) = each($textRows))
        {
          // draw the text line
        }
      }
    }
    la funzione non supporta l'allineamento, anche se modificando un po il codice si potrebbe fare senza problemi

    per spostarti tra le varie linee ti basta leggere l'altezza della riga e aumentare la Y (convervo le informazioni di imagettfbbox proprio per questo motivo, oltre al fatto che modificando il codice si può aggiungere l'allineamento a destra e centrato)


  3. #3
    Ciao Daniele,

    ho trovato anche questa su PHP.net

    Codice PHP:
    <?php

    function im_wordwrap($txt,$font,$size,$width) {
       
    $sep=array(' ','-'); // separators
       
    $res=array();
       
    $buf='';
       
    // main function loop
       
    for($i=0;$i<strlen($txt);$i++) {
           
    $l=$txt{$i};
           if (
    $l=='^') {
               
    $res[]=$buf;
               
    $buf='';
               continue;
           }
           
    $t=$buf.$l;
           
    $bbox=imagettfbbox($size,0,$font,$t);
           
    $left=($bbox[0]>$bbox[6])?$bbox[6]:$bbox[0]; // determine most far points
           
    $right=($bbox[2]>$bbox[4])?$bbox[2]:$bbox[4]; // idem
           
    $w=$right-$left// get total width
           
    if ($w>$width) {
               if (
    $buf=='') return false// FATAL: 1 letter is smallest than the pixel width - avoid infinite loop
               // we can assume that everything present in $buf currently is inside our limits
               // find a separator in string
               
    $fp=false;
               foreach(
    $sep as $s) {
                   
    $p=strrpos($buf,$s);
                   if ((
    $p!==false) and ($p>$fp)) $fp=$p;
               }
               if (
    $fp===false) {
                   
    // let's break here !
                   
    $res[]=$buf;
                   
    $buf='';
                   
    $i--; // dececrase $i to retry this letter
                   
    continue;
               }
               
    // $fp+1 -> we put the separator char at the end of the prev. line =p
               
    $res[]=substr($buf,0,$fp+1);
               
    $buf=substr($buf,$fp+1);
               
    $i--;
               continue;
           }
           
    $buf.=$l;
       }
       if (
    $buf!=''$res[]=$buf;
       return 
    $res;
    }
    ?>
    Il mio problema purtroppo è che non so come richiamare la funzione. e far creare cosi l'immagine.

    Io faccio questo
    Codice PHP:
    header("Content-type: image/jpeg");
      
       
    $font="font/HelveticaNeueRoman.otf";
      
    $stringa="Questo è finto testo";
      
    $fontsize=16;
      
    $l_space=0//spazio a sinistra inizio testo
      
    $r_space=24//spazio a destra alla fine del testo
      
      
      
    $bbox imagettfbbox($fontsize0$font$stringa);
      
    $str_width =  max($bbox[0],$bbox[2],$bbox[4],$bbox[6]) - min($bbox[0],$bbox[2],$bbox[4],$bbox[6]);
      
    $font_space = ($str_width $l_space )+ $r_space 
      
      
    $im imagecreate($font_space 24);
      
    $backcolor imagecolorallocate($im255255255);
      
    $fontcolor imagecolorallocate($im158310);
      
      
    // Replace path by your own font path
      
    imagettftext($im$fontsize0$l_space18$fontcolor"$font",
      
    "$stringa");
      
    imagejpeg($im,"",100);
      
    imagedestroy($im); 
    Quella funzione? dove la caccio?
    MITTICCOOOOOOOOO!

  4. #4
    usa la mia ... ti basta semplicemente inserire il richiamo ... esattamente dove vuoi che venga inserito il testo nella sequenza delle tue operazioni e basta

    (devi solo scrivere 2 righe di codice ... una che disegna la linea e l'altra che incrementa la coordinata Y che dovrebbe corrispondere a qualcosa del tipo

    $y += $fontsize + 2;

    ad esempio)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.