imagen(), función PHP multiúsos para editar imagenes con GD
Ú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:
-
function imagen(
-
$dir,
-
$salida = "imagen",
-
$funcion = '',
-
$giro = "180",
-
-
$alto = '',
-
$ancho = '',
-
-
$tipo = "png",
-
-
$alto_origen = '',
-
$ancho_origen = ''
-
-
){
-
-
//dir es un array??
-
#Si lo es, hago la Funcion a todas las direcciones que tenga
-
$mensaje_de_error = 'Error abriendo %extension%! No se pudo encontrar la imagen, o la imagen está corrupta.';
-
$mensaje_de_error2 = 'El archivo "%valor%" tiene una extensión "%ext%", la cual no está soportada por esta función';
-
$i = 0;
-
foreach($dir as $key => $valor){ //lo recorro
-
if($ext == "gif") { $str = @imagecreatefromgif($valor);
-
} else if($ext == "jpg" || $ext == "jpeg") { $str = @imagecreatefromjpeg($valor);
-
} else if($ext == "png") { $str = @imagecreatefrompng($valor);
-
}
-
if(!is_set($str)){ echo str_replace('%ext%', $ext, str_replace('%extension%', $valor, $mensaje_de_error2)); die;
-
-
$tareas[$i]["dir"] = $valor; //direccion de la imagen original..
-
$tareas[$i]["tipo"] = $tipo; //tipo imagen
-
$tareas[$i]["img"] = $str; //contenido de la imagen en formato universal(PhpGD)
-
$tareas[$i]["alto"] = $altura; //alto de la imagen
-
$tareas[$i]["ancho"] = $ancho; //ancho de la imagen
-
}
-
} else { //si no es un array..
-
$valor = $dir;
-
if($ext == "gif") { $str = @imagecreatefromgif($valor);
-
} else if($ext == "jpg" || $ext == "jpeg") { $str = @imagecreatefromjpeg($valor);
-
} else if($ext == "png") { $str = @imagecreatefrompng($valor);
-
}
-
if(!isset($str)){ echo str_replace('%ext%', $ext, str_replace('%valor%', $valor, $mensaje_de_error2)); die;
-
-
$tareas[$i]["dir"] = $valor; //direccion de la imagen original..
-
$tareas[$i]["tipo"] = $tipo; //tipo de codificacion de imagen
-
$tareas[$i]["img"] = $str; //contenido de la imagen en formato universal(PhpGD)
-
$tareas[$i]["alto"] = $altura; //alto de la imagen
-
$tareas[$i]["ancho"] = $ancho; //ancho de la imagen
-
}
-
//superponer [+] (solo imagenes simples)
-
if(($funcion == "superponer" || $funcion == "combinar" || ($giro=="0" && $alto=='' && $ancho=='') ) && count($tareas)>=1){
-
imagecopy($tareas[$i+1]["img"], $tareas[$i]["img"], 0, 0, 0, 0, $tareas[$i]["ancho"], $valor[$i]["alto"]); // copio sobre la anterior
-
$_tareas = $tareas[$i+1]; // copio los datos de la imagen resultante
-
}
-
}
-
$tareas[0] = $_tareas; //repongo la variable para continuar
-
}
-
-
//girar [+]
-
if($funcion == "girar" || ($alto=='' && $ancho=='') || ($giro> 0 || $giro <0)){
-
foreach($tareas as $key => $valor){
-
$color = imagecolorallocatealpha($tareas[$key]["img"], 255, 255, 255, 0); //tomamos el color transparente
-
$tareas[$key]["img"] = imagerotate($tareas[$key]["img"], $giro, $color);
-
}
-
}
-
-
//redimensionar [+]
-
if($function == "redimensionar" || $function == "recortar" || $alto!='' || $ancho!=''){
-
foreach($tareas as $key => $valor){ //recorremos las imagenes aplicandoles los valores...
-
////////////////////////////////////
-
if($alto != ''){ //si hay un valor de "alto"
-
$newheight = (strrpos($alto, '%')) ? (($valor['alto']/100) * str_replace('%', '', $alto)).'!' : $alto;//porcentaje/pixeles
-
} else { //si no hay valor de "alto"
-
$newheight = $valor['alto'];
-
}
-
-
if($ancho != ''){ //si hay "ancho"
-
$newwidth = (strrpos($ancho, '%')) ? ($valor['ancho']/100) * str_replace('%', '', $ancho) : $ancho; //porcentaje/pixeles
-
} else { //si no hay "ancho"
-
$newwidth = $valor['ancho'];
-
}
-
//////////////////////////////////////
-
$ancho_origen = ($ancho_origen == '') ? 0 : $ancho_origen ;
-
$alto_origen = ($alto_origen == '') ? 0 : $alto_origen ;
-
//////////////////////////////////////
-
-
$thumb = imagecreatetruecolor($newwidth, $newheight); //creo la imagen base en true color
-
// Redimensionar
-
imagecopyresized($thumb, $valor["img"], 0, 0, $ancho_origen, $alto_origen, $newwidth, $newheight, $valor["ancho"], $valor["alto"]);
-
$tareas[$key]["img"] = $thumb;
-
}
-
}
-
//tipos de salida!
-
if($salida == "imagen" || $salida == ''){
-
if($tipo=='png'){
-
$out = imagepng($tareas[0]["img"]);
-
} else if($tipo=='gif'){
-
$out = imagegif($tareas[0]["img"]);
-
} else if($tipo=='jpeg' || $tipo=='jpg'){
-
$out = imagejpeg($tareas[0]["img"]);
-
} else if($tipo=='bmp'){
-
$out = imagewbmp($tareas[0]["img"]);
-
} else {
-
$out = imagejpeg($tareas[0]["img"]);
-
}
-
} else if($salida == "file" || $salida == "archivo") {
-
if($tipo=='png'){
-
$out = imagepng($tareas[0]["img"]);
-
} else if($tipo=='gif'){
-
$out = imagegif($tareas[0]["img"]);
-
} else if($tipo=='jpeg' || $tipo=='jpg'){
-
$out = imagejpeg($tareas[0]["img"]);
-
} else if($tipo=='bmp'){
-
$out = imagewbmp($tareas[0]["img"]);
-
} else {
-
$out = imagejpeg($tareas[0]["img"]);
-
}
-
} else {
-
if($tipo=='png'){
-
$out = imagepng($tareas[0]["img"]);
-
} else if($tipo=='gif'){
-
$out = imagegif($tareas[0]["img"]);
-
} else if($tipo=='jpeg' || $tipo=='jpg'){
-
$out = imagejpeg($tareas[0]["img"]);
-
} else if($tipo=='bmp'){
-
$out = imagewbmp($tareas[0]["img"]);
-
} else {
-
$out = imagejpeg($tareas[0]["img"]);
-
}
-
}
-
return $out;
-
}
Las variables que se podrían utilizar para modificar la función están bastante claras pero de todas formas las comentare..
Ejemplo de giro de imagen:
-
imagen('http://www.tierra0.com/wp-content/themes/satori/images/encabezado.gif', 'imagen', '', '180');
Ejemplo de creación de imagen en miniatura al vuelo.
-
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.
Hola, estoy intentando utilizar tu función imagen(), ahora mi pregunta va basicamente a como utilizarla para cortar una porción de la misma, suponiendo que tengo una imagen de 600×400 y yo quiero obtener solo desde la esquina superior una imagen de 350×195 como debería hacerlo, he intentado y no lo logro, espero me ayudes…