Clase PHP para crear thumbnails de imágenes

Hace unos años creé una clase PHP para crear thumbnails de imágenes porque la necesitaba para un proyecto, necesitaba ciertas cosas de dicha clase que no encontraba en otras muchas que encontré por la red, por lo que me propuse crear la mía propia ajustándola a las necesidades que tenía en ese momento. Hoy, después de algunos ajustes y arreglos para perfeccionarla he decidido compartirla para que quien la necesite pueda hacer uso de ella.

Posibilidades de esta clase:

  • Capacidad de trabajar con los principales formatos de imágenes (jpg, png y gif).
  • Capacidad para redimensionar las imágenes por ancho o alto al valor deseado sin que pierda sus proporciones.
  • Capacidad de recortar la imagen a los valores deseados sin que pierda la proporción original y escogiendo la posición del del recorte.
  • Capacidad de guardar la imagen manipulada en el servidor.
  • Capacidad de mostrar la imagen directamente en el navegador.
  • Capacidad de mantener la transparencia de imágenes PNG o GIF.

Esta clase necesita de la librería GD instalada en el servidor (incluida en PHP a partir de la versión 4.3)

Clase PHP para crear thumbnails de imágenes

class Thumb {

	private $image;
	private $type;
	private $mime;
	private $width;
	private $height;

	//---Método de leer la imagen
	public function loadImage($name) {

		//---Tomar las dimensiones de la imagen
		$info = getimagesize($name);

		$this->width = $info[0];
		$this->height = $info[1];
		$this->type = $info[2];
		$this->mime = $info['mime'];

		//---Dependiendo del tipo de imagen crear una nueva imagen
		switch($this->type){

			case IMAGETYPE_JPEG:

				$this->image = imagecreatefromjpeg($name);

			break;

			case IMAGETYPE_GIF:

				$this->image = imagecreatefromgif($name);

			break;

			case IMAGETYPE_PNG:

				$this->image = imagecreatefrompng($name);

			break;

			default:

				trigger_error('No se puede crear un thumbnail con el tipo de imagen especificada', E_USER_ERROR);

		}

	}

	//---Método de guardar la imagen
	public function save($name, $quality = 100, $type = false) {

		//---Si no se ha enviado un formato escoger el original de la imagen
		$type = ($type) ? $type : $this->type;

		//---Guardar la imagen en el tipo de archivo correcto
		switch($type){

			case IMAGETYPE_JPEG:

				imagejpeg($this->image, $name . image_type_to_extension($type), $quality);

			break;

			case IMAGETYPE_GIF:

				imagegif($this->image, $name . image_type_to_extension($type));

			break;

			case IMAGETYPE_PNG:

				$pngquality = floor($quality / 100 * 9);

				imagepng($this->image, $name . image_type_to_extension($type), $pngquality);

			break;

			default:

				trigger_error('No se ha especificado un formato de imagen correcto', E_USER_ERROR);

		}

	}

	//---Método de mostrar la imagen sin guardarla
	public function show($type = false, $base64 = false) {

		//---Si no se ha enviado un formato escoger el original de la imagen
		$type = ($type) ? $type : $this->type;

		if($base64) ob_start();

		//---Mostrar la imagen dependiendo del tipo de archivo
		switch($type){

			case IMAGETYPE_JPEG:

				imagejpeg($this->image);

			break;

			case IMAGETYPE_GIF:

				imagegif($this->image);

			break;

			case IMAGETYPE_PNG:

				$this->prepareImage($this->image);

				imagepng($this->image);

			break;

			default:

				trigger_error('No se ha especificado un formato de imagen correcto', E_USER_ERROR);

				exit;

		}

		if($base64) {

			$data = ob_get_contents();

			ob_end_clean ();

			return 'data:' . $this->mime . ';base64,' . base64_encode($data);

		}

	}

	//---Método de redimensionar la imagen sin deformarla
	public function resize($value, $prop){

		//---Determinar la propiedad a redimensionar y la propiedad opuesta
		$prop_value = ($prop == 'width') ? $this->width : $this->height;
		$prop_versus = ($prop == 'width') ? $this->height : $this->width;

		//---Determinar el valor opuesto a la propiedad a redimensionar
		$pcent = $value / $prop_value;
		$value_versus = $prop_versus * $pcent;

		//---Crear la imagen dependiendo de la propiedad a variar
		$image = ($prop == 'width') ? imagecreatetruecolor($value, $value_versus) : imagecreatetruecolor($value_versus, $value);	

		//---Tratar la imagen
		if($this->type == IMAGETYPE_GIF || $this->type == IMAGETYPE_PNG) $this->prepareImage($image);	

		//---Hacer una copia de la imagen dependiendo de la propiedad a variar
		switch($prop){

			case 'width':

				imagecopyresampled($image, $this->image, 0, 0, 0, 0, $value, $value_versus, $this->width, $this->height);

			break;

			default:

				imagecopyresampled($image, $this->image, 0, 0, 0, 0, $value_versus, $value, $this->width, $this->height);

		}

		//---Actualizar la imagen y sus dimensiones
		$this->width = imagesx($image);
		$this->height = imagesy($image);
		$this->image = $image;

	}

	//---Método de extraer una sección de la imagen sin deformarla
	public function crop($cwidth, $cheight, $pos = 'center') {

		$pcent = min($this->width / $cwidth, $this->height / $cheight);
		$bigw = (int) ($pcent * $cwidth);
		$bigh = (int) ($pcent * $cheight);

		//---Crear la imagen
		$image = imagecreatetruecolor($cwidth, $cheight);

		//---Tratar la imagen
		if($this->type == IMAGETYPE_GIF || $this->type == IMAGETYPE_PNG) $this->prepareImage($image);

		//---Dependiendo de la posición copiar
		switch($pos){

			case 'left':

				imagecopyresampled($image, $this->image, 0, 0, 0, abs(($this->height - $bigh) / 2), $cwidth, $cheight, $bigw, $bigh);

			break;

			case 'right':

				imagecopyresampled($image, $this->image, 0, 0, $this->width - $bigw, abs(($this->height - $bigh) / 2), $cwidth, $cheight, $bigw, $bigh);

			break;

			case 'top':

				imagecopyresampled($image, $this->image, 0, 0, abs(($this->width - $bigw) / 2), 0, $cwidth, $cheight, $bigw, $bigh);

			break;

			case 'bottom':

				imagecopyresampled($image, $this->image, 0, 0, abs(($this->width - $bigw) / 2), $this->height - $bigh, $cwidth, $cheight, $bigw, $bigh);

			break;

			default:

				imagecopyresampled($image, $this->image, 0, 0, abs(($bigw - $this->width) / 2), abs(($bigh - $this->height) / 2), $cwidth, $cheight, $bigw, $bigh);

		}

		$this->width = $cwidth;
		$this->height = $cheight;
		$this->image = $image;

	}

	//---Método privado de tratar las imágenes antes de mostrarlas
	private function prepareImage($image){

		//---Dependiendo del tipo de imagen
		switch($this->type){

			case IMAGETYPE_GIF:

				$background = imagecolorallocate($image, 0, 0, 0);
				imagecolortransparent($image, $background);

			break;

			case IMAGETYPE_PNG:

				imagealphablending($image, FALSE);
				imagesavealpha($image, TRUE);

			break;

		}

	}

}

Métodos públicos de la clase

//Leer la imagen desde la ruta especificada
loadImage(string $name)
$name Ruta de la imagen
//Guarda la imagen en la ruta especificada
save(string $name [, int $quality = 100] [, int $type = false])
$name Ruta donde se guardará la imagen
$quality Calidad de la imagen con un valor de 0 a 100
$type Tipo de imagen definido por una constante IMAGETYPE_XXX (IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF), si no se envía se guarda la imagen en su formato original
//Muestra la imagen directamente en la página o devuelve una representación en base64 de la misma
show([int $type = false] [,boolean $base64 = false])
$type Tipo de imagen definido por una constante IMAGETYPE_XXX (IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_GIF), si no se envía se muestra la imagen en su formato original
$base64 Especifica si el flujo de la imagen debe imprimirse directamente en la página o si se desea que devuelva una representación en base64 de la misma para usarla como parámetro «src» de un elemento «img».
//Redimensiona la imagen manteniendo sus proporciones
resize(int $value, string $reference)
$value El valor de ancho o alto al que se desea redimensionar la imagen
$reference String que define si la imagen se redimensionará tomando como referencia el ancho o el alto (valores posibles: ‘width’ o ‘height’)
//Recorta la imagen creando un thumbnail de la misma
crop(int $width, int $height [, string $position = 'center'])
$width El valor de ancho del thumbnail
$height El valor de alto del thumbnail
$position La posición de donde se tomará el thumbnail (valores posibles: ‘top’, ‘right’, ‘bottom’, ‘left’ o ‘center’)

Demo en funcionamiento

Ver demo

Descarga de ficheros

Descarga los ficheros de ejemplo de la Clase PHP para crear thumbnails de imágenes.

(4 votos, promedio: 4,75 de 5)
Comparte este artículo:

7 Comentarios

  1. Excelente codigo amigo! realmente sacas de apuro a muchos de nosotros…una sugerencia, crees poder ser flexible en el resize, es decir colocar los valores de alto y ancho sin ser proporcional…

    • Hola Azael:

      Eso es justamente lo que hace el método crop:

      //Recorta la imagen creando un thumbnail de la misma
      crop(int $width, int $height [, string $position = 'center'])
      

      Puedes ver su uso y el resultado en la página de demostración.

      Un saludo y me alegra que te haya servido de ayuda.

Puedes situar fragmentos de código dentro de etiquetas <pre></pre> y código HTML o XML entre etiquetas <xmp></xmp>.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


El periodo de verificación de reCAPTCHA ha caducado. Por favor, recarga la página.