Thumbnails proporcionales al original - PHP

De Reyesoft

Esta función permite:

  • Crear imágenes a partir de otra con un ancho y alto límite, haciendo que siempre sean proporcionales a la original.
  • Obligar a que sean guardadas en un solo formato; esto es aunque suban un GIF, PNG o JPG simpre guardará en JPG, por ejemplo.

Cómo utilizarla

imagen_dimensionar($archivo_origen, $archivo_destino, $ancho_maximo, $alto_maximo);

La función devuelve un string con la extensión del archivo final, que es utilizada en caso de que no se haya especificado ninguno en $archivo_destino.

La función

function imagen_dimensionar($origen, $destino, $ancho_limite=2000, $alto_limite=2000)
{
	//creamos carpeta de destino
	$temp = explode('/', $destino);
	$temp[count($temp)-1] = '';
	$carpeta_destino = implode('/', $temp);
	@mkdir($carpeta_destino);
	
	//respeta el ancho y el alto
	list($ancho_orig, $alto_orig, $tipo, $atr) = getimagesize($origen);

	//para que no agrande la imagen
	if ($ancho_orig < $ancho_limite) $ancho_limite = $ancho_orig;
	if ($alto_orig < $alto_limite) $alto_limite = $alto_orig;

	$alto_limite_probable = $alto_orig * $ancho_limite / $ancho_orig;
	if ($alto_limite_probable > $alto_limite)
	{
		$ancho_limite = $ancho_orig * $alto_limite / $alto_orig;
	}
	else
	{
		$alto_limite = $alto_limite_probable;
	}
	return imagen($origen, $destino, $ancho_limite, $alto_limite);
}
function imagen($origen, $destino, $ancho, $alto)
{
	$calidad = 90;
	$size = getimagesize($origen); //Tomamos la dimension de la imagen  
	
	$extensiones = array('', 'gif', 'jpg', 'png');
	
	//obtenemos si el sistema desea obligar a un formato de salida
	$ext = strtolower(substr($destino, strlen($destino)-4));
	switch ($ext)
	{
		case '.gif':
			$salida_formato = 1;
			break;
		case '.jpg':
			$salida_formato = 2;
			break;
		case 'jpeg':
			$salida_formato = 2;
			break;
		case '.png':
			$salida_formato = 3;
			break;
		default:
			$salida_formato = $size[2];
			$destino = $destino.'.'.$extensiones[$salida_formato];
	}
	
	$width = $size[0];
	$height = $size[1];
	$ratio = $width/$ancho;
	$aux_height = $height/$ratio;
	
	//tomamos el tipo
	if($size[2]==1){$src = @imagecreatefromgif($origen);}
	if($size[2]==2){$src = @imagecreatefromjpeg($origen);}
	if($size[2]==3){$src = @imagecreatefrompng($origen);}

	if (!$src) 
	{
		return -1;
	}
	else
	{
		//Creamos una imagen a color real temporal donde copiamos el original  
		$aux = imagecreatetruecolor($ancho, $aux_height);  
		//Creamos una imagen a color real el cual será el soporte final del resultado  
		$dst = imagecreatetruecolor($ancho, $alto);
		//Copiamos el contenido de la imagen original a la nueva  
		imagecopyresampled($aux, $src, 0, 0, 0, 0, $ancho, $aux_height, $width, $height);
		//Pegamos la imagen copiada
		imagecopy($dst, $aux, 0, 0, 0, ($aux_height-$alto)/2, $ancho, $alto);  
		imagedestroy($aux);  

		if($salida_formato==1){ imagegif($dst, $destino);}
		if($salida_formato==2){ imagejpeg($dst, $destino, $calidad);}
		if($salida_formato==3){ imagepng($dst, $destino);}

		imagedestroy($src);
		imagedestroy($dst);
		return $extensiones[$salida_formato];
	}
}
Herramientas personales