retoque de imagenes con PHPÚltimamente parece que no posteo nada pero es por que hago muy pocas funciones que puedan tener un interés general.. Para cambiar esa rutina he decidido liberar una que tenia a medio acabar.
Como me ocurrió cuando termine la función archivo() tenia un conjunto de cosas que se hacían en muchísimos proyectos y que no había una función que me las englobara, lo que hacia que tuviéremos que poner una serie de mini-códigos que se repetían hasta la nausea. Por eso decidí hacer la función imagen().

La función imagen esta destinada a ser un comodín para realizar diversas operaciones con imágenes rápidamente... como redimensionar a unos valores dados para hacer thumbnails, cortar una zona de la imagen, pegar varias imágenes unas encima de otras (marcas de agua), girar imágenes, convertirlas entre formatos... todo sin tener que repetir continuamente las detecciones del tipo de codificacion del archivo etc etc etc.. en todos los casos la función puede dar como resultado un archivo o un string, que seria el contenido de la imagen, pudiendo así mostrar la imagen con solo añadirle el header() correspondiente.

Todas las funciones están echas en PHP4 con GD. El soporte de GD es necesario para que funcione.

Código de la función:

PHP:
  1. function imagen(
  2.     $dir,
  3.     $salida = "imagen",
  4.     $funcion = '',
  5.     $giro = "180",
  6.  
  7.     $alto = '',
  8.     $ancho = '',
  9.  
  10.     $tipo = "png",
  11.    
  12.     $alto_origen = '',
  13.     $ancho_origen = ''
  14.  
  15.     ){
  16.    
  17.     //dir es un array??
  18.     #Si lo es, hago la Funcion a todas las direcciones que tenga
  19.     $tareas    = array();
  20.     $mensaje_de_error   = 'Error abriendo %extension%! No se pudo encontrar la imagen, o la imagen está corrupta.';
  21.     $mensaje_de_error2  = 'El archivo "%valor%" tiene una extensión "%ext%", la cual no está soportada por esta función';
  22.     $i          = 0;
  23.     if(is_array($dir)){ //si es un array..
  24.         foreach($dir as $key => $valor){    //lo recorro
  25.             $ext = @substr($valor, strrpos($valor, '.')+1);  //obtengo la extension de la imagen
  26.             $ext = strtolower($ext);
  27.             if($ext == "gif") {        $str = @imagecreatefromgif($valor);
  28.             } else if($ext == "jpg" || $ext == "jpeg") {    $str = @imagecreatefromjpeg($valor);
  29.             } else if($ext == "png") {            $str = @imagecreatefrompng($valor);                  
  30.             }
  31.             if(!is_set($str)){  echo str_replace('%ext%', $ext, str_replace('%extension%', $valor, $mensaje_de_error2)); die
  32.             } else if($str===false){ echo str_replace('%extension%', $valor, $mensaje_de_error); die;   }
  33.                    
  34.             list($ancho, $altura, $tipo, $atr)  = getimagesize($valor);
  35.             $tareas[$i]["dir"]          = $valor//direccion de la imagen original..
  36.             $tareas[$i]["tipo"]     = $tipo//tipo imagen
  37.             $tareas[$i]["img"]          = $str;      //contenido de la imagen en formato universal(PhpGD)
  38.             $tareas[$i]["alto"]     = $altura;   //alto de la imagen
  39.             $tareas[$i]["ancho"]                = $ancho;   //ancho de la imagen
  40.         }
  41.     } else {    //si no es un array..
  42.         $valor  = $dir;
  43.         $ext    = @substr($valor, strrpos($valor, '.')+1);    //obtengo la extension de la imagen
  44.         if($ext == "gif") {        $str = @imagecreatefromgif($valor);
  45.         } else if($ext == "jpg" || $ext == "jpeg") {    $str = @imagecreatefromjpeg($valor);
  46.         } else if($ext == "png") {            $str = @imagecreatefrompng($valor);                  
  47.         }
  48.         if(!isset($str)){   echo str_replace('%ext%', $ext, str_replace('%valor%', $valor, $mensaje_de_error2)); die
  49.         } else if($str===false){ echo str_replace('%extension%', $valor, $mensaje_de_error); die;   }
  50.        
  51.         list($ancho, $altura, $tipo, $atr)  = getimagesize($valor);
  52.         $tareas[$i]["dir"]          = $valor//direccion de la imagen original..
  53.         $tareas[$i]["tipo"]     = $tipo//tipo de codificacion de imagen
  54.         $tareas[$i]["img"]          = $str;      //contenido de la imagen en formato universal(PhpGD)
  55.         $tareas[$i]["alto"]     = $altura;   //alto de la imagen
  56.         $tareas[$i]["ancho"]                = $ancho;   //ancho de la imagen
  57.     }
  58.     //superponer [+] (solo imagenes simples)
  59.     if(($funcion == "superponer" || $funcion == "combinar" || ($giro=="0" && $alto=='' && $ancho=='') ) && count($tareas)>=1){
  60.         for($i=0; $i<=count($tareas); $i++) {   //recorro las imagenes cargadas
  61.             if($i != count($tareas)){         //si aun no se ha realizado la penultima tarea
  62.                 imagecopy($tareas[$i+1]["img"], $tareas[$i]["img"], 0, 0, 0, 0, $tareas[$i]["ancho"], $valor[$i]["alto"])// copio sobre la anterior
  63.                 $_tareas = $tareas[$i+1]; // copio los datos de la imagen resultante
  64.             }
  65.         }
  66.         unset($tareas);         //borro la variable
  67.         $tareas[0] = $_tareas//repongo la variable para continuar
  68.     }
  69.    
  70.     //girar [+]
  71.     if($funcion == "girar" || ($alto=='' && $ancho=='') || ($giro> 0 || $giro <0)){
  72.         foreach($tareas as $key => $valor){
  73.             $color = imagecolorallocatealpha($tareas[$key]["img"], 255, 255, 255, 0); //tomamos el color transparente
  74.             $tareas[$key]["img"] = imagerotate($tareas[$key]["img"], $giro, $color);
  75.         }
  76.     }
  77.    
  78.     //redimensionar [+]
  79.     if($function == "redimensionar" || $function == "recortar" || $alto!='' || $ancho!=''){
  80.         foreach($tareas as $key => $valor){ //recorremos las imagenes aplicandoles los valores...
  81.             ////////////////////////////////////
  82.             if($alto != ''){ //si hay un valor de "alto"
  83.                 $newheight  = (strrpos($alto, '%')) ? (($valor['alto']/100) * str_replace('%', '', $alto)).'!' : $alto;//porcentaje/pixeles
  84.             } else { //si no hay valor de "alto"
  85.                 $newheight    = $valor['alto'];
  86.             }
  87.            
  88.             if($ancho != ''){ //si hay "ancho"
  89.                 $newwidth = (strrpos($ancho, '%')) ? ($valor['ancho']/100) * str_replace('%', '', $ancho) : $ancho; //porcentaje/pixeles
  90.             } else { //si no hay "ancho"
  91.                 $newwidth      = $valor['ancho'];
  92.             }
  93.             //////////////////////////////////////
  94.             $ancho_origen   = ($ancho_origen == '')    ? 0 : $ancho_origen ;
  95.             $alto_origen    = ($alto_origen == '')  ? 0 : $alto_origen    ;
  96.             //////////////////////////////////////
  97.            
  98.             $thumb = imagecreatetruecolor($newwidth, $newheight); //creo la imagen base en true color
  99.             // Redimensionar
  100.             imagecopyresized($thumb, $valor["img"], 0, 0, $ancho_origen, $alto_origen, $newwidth, $newheight, $valor["ancho"], $valor["alto"]);
  101.             $tareas[$key]["img"] = $thumb;
  102.         }
  103.     }
  104.     //tipos de salida!
  105.     $salida = strtolower($salida);
  106.     if($salida == "imagen" || $salida == ''){
  107.         if($tipo=='png'){
  108.             $out = imagepng($tareas[0]["img"]);
  109.         } else if($tipo=='gif'){
  110.             $out = imagegif($tareas[0]["img"]);
  111.         } else if($tipo=='jpeg' || $tipo=='jpg'){
  112.             $out = imagejpeg($tareas[0]["img"]);
  113.         } else if($tipo=='bmp'){
  114.             $out = imagewbmp($tareas[0]["img"]);
  115.         } else {
  116.             $out = imagejpeg($tareas[0]["img"]);
  117.         }
  118.         header("Content-type: image/".$tipo);
  119.     } else if($salida == "file" || $salida == "archivo") {
  120.         if($tipo=='png'){
  121.             $out = imagepng($tareas[0]["img"]);
  122.         } else if($tipo=='gif'){
  123.             $out = imagegif($tareas[0]["img"]);
  124.         } else if($tipo=='jpeg' || $tipo=='jpg'){
  125.             $out = imagejpeg($tareas[0]["img"]);
  126.         } else if($tipo=='bmp'){
  127.             $out = imagewbmp($tareas[0]["img"]);
  128.         } else {
  129.             $out = imagejpeg($tareas[0]["img"]);
  130.         }
  131.     } else {
  132.         if($tipo=='png'){
  133.             $out = imagepng($tareas[0]["img"]);
  134.         } else if($tipo=='gif'){
  135.             $out = imagegif($tareas[0]["img"]);
  136.         } else if($tipo=='jpeg' || $tipo=='jpg'){
  137.             $out = imagejpeg($tareas[0]["img"]);
  138.         } else if($tipo=='bmp'){
  139.             $out = imagewbmp($tareas[0]["img"]);
  140.         } else {
  141.             $out = imagejpeg($tareas[0]["img"]);
  142.         }
  143.         header("Content-type: image/".$tipo);
  144.     }
  145.     return $out;
  146. }

Las variables que se podrían utilizar para modificar la función están bastante claras pero de todas formas las comentare..

  • La primera variable indica una dirección o un array de direcciones de las imágenes a modificar.. a la salida todas las imágenes serán una sola, siendo solapadas. Esta es la unica variable que no se puede dejar en blanco
  • La segunda variable es el tipo de salida.. si su valor es "imagen" da como resultado el string del contenido de la imagen en el mismo documento, si por el contrario es "archivo", guarda en un archivo con la primera ruta especificada..
  • La tercera variable indica la funcion especifica a realizar.. sus valores efectivos pueden ser: superponer, combinar, girar, redimensionar y recortar. Un valor fuera de estos puede causar resultados impredecibles.
  • La cuarta indica el ángulo al que se quiere girar la imagen.
  • La quinta y sexta indican en alto y ancho de destino de la imagen resultante. Pueden establecerse como números simples o agregando el símbolo % al final para conseguir que se redimensionen con respecto a un porcentaje. Las medidas no mantendrán la proporción automáticamente..
  • La séptima indica el formato de salida de imagen. Los formatos validos son: PNG, JPG, JPEG, GIF y BMP. Cualquier otro valor transformará la salida a JPG.
  • La octava y novena variable indican los márgenes de alto y ancho respectivamente a los que se recortara la imagen de salida.
  • Ejemplo de giro de imagen:

    PHP:
    1. header('Content-type: image/png');
    2. imagen('http://www.tierra0.com/wp-content/themes/satori/images/encabezado.gif', 'imagen', '', '180');

    Ejemplo de creación de imagen en miniatura al vuelo.

    PHP:
    1. header('Content-type: image/png');
    2. imagen('http://www.tierra0.com/wp-content/themes/satori/images/encabezado.gif', 'imagen', '', '0', '50', '50');

    A decir verdad, no me ha dado aun tiempo a probar muchos ejemplos de lo que se podría hacer así que si tenéis algún problema o otros ejemplos de aplicación solo tenéis que comentarlo.. (si son problemas y viene con solución mejor ;-) ). Que lo disfrutéis.