Hace poco ayudé a un amigo a crear una aplicación en facebook muy chorra, que te decía en qué ciudades tienes más amigos (amigos de facebook, claro).

La cuestión es que una de las cosas que hacía era crear una imagen a partir de una plantilla, en la que se introducían una serie de textos.

En fin, que el resultado final era sacar algo como esto:

Como me comentó que en el futuro iba a crear alguna cosita más de este tipo creé la siguiente librería, que toma una imagen como base y en la que puedes insertar una serie de textos encima. Su código es:

class MyGDLib{
  private $background;
  private $texts;
  private $layers;
  
  function __construct()
  {
    $this->texts = array();  
    $this->layers = array();
  }

  //Crea la imagen
  function create($fileName=NULL)
  {
    $picture = @ImageCreateFromPNG ($this->background);
    $path = realpath(IMG_CACHE_DIR);
    
    foreach($this->texts as $text) //Escribimos los textos que hemos ido añadiendo
    {
      $size = ImageTTFBBox($text['size'], 0, $text['font'], $text['text']);
      $color = ImageColorAllocate ($picture, $text['r'], $text['g'], $text['b']);
      
      $textWidth = $size[2] - $size[0]; 
      $x = $text['x'];
      
      if($text['align'] == 'C') //Corrección si la alineación del texto es centrada
        $x -= $textWidth / 2;
        
      if($text['align'] == 'R') //Corrección si la alineación del texto es a la derecha
        $x -= $textWidth; 

      imagettftext($picture, $text['size'], 0, $x, $text['y'], $color, $text['font'], $text['text']);
    }
    
    
    if(empty($fileName))
    {
      $fileName = uniqid();
    }
    ob_start();
      imagepng ($picture); 
      $png = ob_get_contents();
    ob_end_clean();
    file_put_contents($path.ID_APP_DB.'_'.$fileName.'.png', $png); //Guardamos la imagen en un directorio temporal que se borra automáticamente cada hora

    return ID_APP_DB.'_'.$fileName.'.png'; //Como la hice muy específica para Facebook, aquí pilla la constante en la que está guardado el ID de la aplicación
  }

  //Establece la 'imagen base'
  function setBackground($bg) 
  {
    $this->background = $bg;
  }

  //Añade una línea de texto en unas coordenadas determinadas, en base a un código de color RGB y una determinada alineación ('L' para izquierda, 'C' para centrado y 'R' para derecha)
  function addText($x, $y, $font, $size, $text, $r, $g, $b, $align='L') 
  {
    $this->texts[] = array('x' => $x, 'y' => $y, 'font' => $font, 'size' => $size, 'text' => $text, 'r' => $r, 'g' => $g, 'b' => $b, 'align' => $align);
  }
}

Para crear la imagen, tuve que invocar mi librería de la siguiente manera (info: usamos CodeIgniter para la aplicación):

  private function getPodium($locations)
  {
    $me = $this->facebook->api('/me', array('fields' => 'id,name,location'));
    
    $this->mygdlib->setBackground(base_url().'img/podium.png'); //Establezco imagen base
    $this->mygdlib->addText(394, 80, 'ttf/helveticaneue.ttf', 23, $me['name'], 0, 0, 0, 'C'); //Nombre del usuario de facebook

    $i = 1;
    foreach($locations as $location => $friends) //Locations es un mapa de tres elementos, donde la clave es el nombre de la localización, y el valor el número de amigos en ella. Cada uno tiene unas coordenadas y alineación específicas
    {
      $x = $y = $align = NULL;
      switch($i)
      {
        case 1: $x = 304; $y = 217; $align = 'L'; break;
        case 2: $x = 296; $y = 274; $align = 'R'; break;
        case 3: $x = 425; $y = 261; $align = 'L'; break;
      }
      
      if($x == NULL || $y == NULL)
        break;
        
      $this->mygdlib->addText($x, $y, 'ttf/helveticaneue.ttf', 15, "$location", 0, 0, 0, $align);
      $this->mygdlib->addText($x, $y+20, 'ttf/helveticaneue.ttf', 15, "$friends amigos", 0, 0, 0, $align);
      
      $i++;
    }
    
    return $this->gdlib->create($me['id']); //Crea la imagen
  }
Anuncios