Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. PHP

Redimensionamiento de imágenes hecho fácil con PHP

by
Difficulty:IntermediateLength:LongLanguages:

Spanish (Español) translation by Farid Colmenarez (you can also view the original English article)

¿Alguna vez quisiste un método multipropósito y fácil de usar para redimensionar tus imágenes en PHP? Bueno para eso son las clases en PHP, para crear piezas funcionales reusables que podemos llamar para que hagan el trabajo sucio tras bastidores. Aprenderemos como crear nuestra propia clase tan bien construida, como expandible. Redimensionar debería ser fácil. ¿Que tan fácil? ¡Tan fácil como tres pasos!

Introducción

Para dar un vistazo rápido a lo que estamos tratando de lograr con nuestra clase, la clase debe ser:

  • Fácil de usar
  • Independiente del formato. Por ejemplo: abrir, redimensionar y guardar un número de imágenes de diferentes formatos.
  • Tamaño inteligente - ¡sin distorsión de la imagen!

Nota: Esto no es un tutorial sobre cómo crear clases y objetos, y aunque esta habilidad ayudaría, no es necesaria para seguir este tutorial.

Hay mucho que cubrir - Comencemos.


Paso 1 Preparación

Comenzaremos con facilidad. Crea dos archivos en tu directorio de trabajo: uno llamado index.php, el otro resize-class.php


Paso 2 Llamando al Objeto

Para darte una idea que lo que tratamos de lograr, comenzaremos escribiendo el código de las llamadas que usaremos para redimensionar las imágenes. Abre el archivo index.php y agrega el siguiente código.

Como puedes ver, hay una bonita lógica en lo que estamos haciendo. Abrimos el archivo de imagen, establecemos las dimensiones a las que queremos llevar la imagen y el tipo de redimensión.
Luego guardamos la imagen, elegimos el formato de imagen que queremos y la calidad de imagen. Guarda y cierra el archivo index.php.

Del código anterior se puede ver que estamos abriendo un archivo jpg pero guardamos un gif. Recuerda, todo es cuestión de flexibilidad.


Paso 3 Esqueleto de la clase

Es la Programación Orientada a Objetos (POO) lo que hace posible esta sensación de facilidad. Piensa en una clase como si fuera un patrón; puedes encapsular los datos - otra jerga que en realidad solamente significa esconder los datos. Podemos reutilizar esta clase una y otra vez sin necesidad de volver a escribir nada de código del redimensionamiento - solamente necesitar llamar a los métodos apropiados tal como lo hicimos en el paso dos. Una vez que nuestro patrón ha sido creado, podemos crear instancias de este patrón, llamados objetos.

"La función construct. conocida como el constructor, es un tipo de método especial de las clases que es llamado por la clase cuando creas un nuevo objeto."

Comenzemos a crear nuestra clase de redimensionamiento. Abre tu archivo resize-class.php Debajo está una estructura esqueleto de clase muy básica que he llamado 'resize'. Fíjate en la línea comentada de la variable de la clase; aquí es donde comenzaremos a añadir nuestras variables de clase importantes más tarde.

La función construct. conocida como el constructor, es un tipo de método especial de las clases (el término "método" es el mismo que función, sin embargo, cuando hablamos de clases y objetos el término método es usado a menudo) que es llamado por la clase cuando creas un nuevo objeto. Esto hace adecuado que hagamos inicialización - lo cual haremos en el próximo paso.

Fíjate que eso es un doble guión bajo para el método construct.


Paso 4 El Constructor

Vamos a modificar el método constructor de arriba. Primeramente, pasaremos el nombre de archivo (y la ruta) de nuestra imagen a ser redimensionada. Llamaremos a estar variable $fileName

Necesitamos abrir el archivo mencionado con PHP (más específicamente con la Librería PHP GD) para que PHP pueda leer la imagen. Haremos esto con el método personalizado 'openImage' Llegaré a cómo funciona este método
en un momento, pero por ahora, necesitamos guardar el resultado como una variable de clase. Una variable de clase es solamente una variable - pero es específica de esa clase. ¿Recuerdas el comentario de las variables de clase que mencioné anteriormente? Añade 'image' como una variable privada escribiendo 'private $image;'. Definiendo la variable como "Privada" estás configurando el ámbito de esa variable para que sólo sea accedida por la clase. De ahora en adelante podemos hacer un llamado a nuestra imagen abierta, conocido como un recurso, el cual haremos más tarde cuando redimensionemos.

Mientras estamos en ello, vamos a almacenar la altura y la anchura de la imagen. Tengo la sensación de que serán últiles más tarde.

Ahora deberías tener lo siguiente.

Los métodos imagesx y imagesy son funciones incorporadas que son parte de la librería GD. Ellas obtienen la anchura y la altura de tu imagen, respectivamente.


Paso 5 Abrir la imagen

En el paso anterior, llamamos al método personalizado openImage. En este paso vamos a crear ese método. Queremos que el script piense por nosotros, así que dependiendo del tipo de archivo que sea pasado, el script debe determinar que función de la Librería GD llamar para abrir la imagen. Esto es fácilmente logrado comparando las extensiones de los archivos son una sentencia switch.

Pasamos nuestro archivo que queremos redimensionar y regresa el recurso de ese archivo.


Paso 6 Cómo redimensionar

Aquí es donde el amor sucede. Este paso es realmente solo una explicación de lo que vamos a hacer - así que no hay tarea aquí. En el próximo paso, vamos a crear un método publico que llamaremos para ejecutar nuestra redimensión, así que tiene sentido pasar el ancho y el alto, así como información sobre cómo queremos redimensionar la imagen. Hablemos sobre esto por un momento. Habrán escenarios en los que querrás redimensionar una imagen a un tamaño exacto. Genial, incluyamos esto. Pero también existirán momentos en los que tendrás que redimensionar cientos de imágenes con diferentes relaciones de aspecto - piensa en imágenes de retratos. Redimensionarlas a un tamaño exacto causara distorsiones graves. Si echamos un vistazo a nuestras opciones para prever distorsiones podemos:

  1. Redimensionar la imagen al tamaño mas cercano que podamos de nuestras nuevas dimensiones, manteniendo aún la relación de aspecto.
  2. Redimensionar la imagen tan cerca como podamos de nuestras nuevas dimensiones y recortar el remanente.

Ambas opciones son viables, dependiendo de tus necesidades.

Sip. vamos a tratar de manejar todo lo anterior. Para resumir, vamos a proporcionar opciones para:

  1. Redimensionar a una exacta anchura/altura. (exacta)
  2. Redimensionar por anchura - una anchura exacta será fijada, la altura se ajustará según la relación de aspecto (paisaje)
  3. Redimensionar por altura - tal como redimensionar por anchura, pero la altura será fijada y la anchura será ajustada dinámicamente. (retrato)
  4. Auto determinar opciones 2 y 3. Si estas iterando a través de un directorio con fotos de diferentes tamaños, dejemos que el script determine como manejarlo. (auto)
  5. Redimensionar, luego recortar. Esta es mi favorita. Tamaño exacto, sin distorsion. (recortar)

Paso 7 Redimensionar. ¡Hagámoslo!

Existen dos partes del método para redimensionar. La primera es obtener la anchura y la altura óptima para nuestra nueva imagen creando algunos métodos personalizados. - y por supuesto pasando nuestra opción de redimensionamiento como fue descrito anteriormente. La anchura y la altura son devueltas como un arreglo y son fijadas en sus variables respectivas. Siéntete libre de 'pasar como referencia' - pero yo no soy muy fanático de eso.

La segunda parte es lo que ejecuta la redimensión en sí. Para mantener este tutorial en un tamaño pequeño, te dejaré leer las siguientes funciones de GD.

También guardamos la salida del método imagecreatetruecolor (una imagen nueva en color verdadero) como una variable de clase. Añade 'private $imageResized;' con tus otras variables de clase.

El redimensionamiento es ejecutado por un módulo PHP conocido como la Librería GD. Muchos de los métodos que estamos usando son proporcionados por esta librería.


Paso 8 El árbol de decisión.

Mientras más trabajo hagas ahora, menos tendrás que hacer cuando redimensiones. Este método elige la ruta a tomar, con el objetivo de obtener la anchura y altura óptimas para el redimensionamiento basado en tus opciones. Él llamará al método apropiado, entre los que estaremos creando en el próximo paso.


Paso 9 Dimensiones óptimas

Ya hemos discutido lo que estos cuatro métodos hacen. Son simplemente matemática simple, en realidad, que calculan nuestro mejor ajuste.


Paso 10 Recortar

Si elegiste ir por un recorte - esto es, que has usado la opción de recortar, entonces tendrás que dar un pequeño paso adicional. Vamos a recortar la imagen desde el centro
. Recortar es un proceso muy similar a redimensionar pero con un par de parámetros de tamaño más.


Paso 11 Guardar la imagen.

Estamos allí; casi listos. Ahora es tiempo de guardar la imagen. Pasamos la ruta, y la calidad de imagen que queremos entro 0 y 100, siendo 100 la mejor, y llamamos al método apropiado. Un par de cosas que acotar sobre la calidad de la imagen: JPG usa una escala del 0 al 100, siendo 100 la mejor. Las imágenes GIF no tienen un ajuste de calidad de imagen. Las PNG sí, pero usan una escala del 0 al 9, siendo 0 la mejor. Esto no es bueno ya que no podemos esperar recordar esto cada vez que queramos guardar una imagen. Hacemos un poco de magia para estandarizar todo.

Ahora también es un buen momento para destruir el recurso de nuestra imagen para liberar algo de memoria. Si fueras a usar esto en producción, también podría ser una buena idea capturar y retornar el resultado de la imagen guardada.


Conclusión

Bueno, esto es todo amigos. Gracias por seguir este tutorial, espero que lo encuentren útil. Apreciaría sus reacciones, a través de los comentarios debajo.

Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.