Advertisement
  1. Code
  2. PHP

Redimensionar y Manipular Imágenes en PHP (con Ejemplos)

Scroll to top
Read Time: 10 min

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

En mi tutorial anterior, discutimos la manipulación básica de imágenes usando la biblioteca PHP GD. En ese tutorial, hice una breve introducción a la libreria y te mostré cómo cargar imágenes de un archivo o crearlas desde cero en PHP.   Cubrí la función imagefilter() para aplicar diferentes filtros a los recursos de imagen cargados en el script.  También mencioné algunas funciones útiles en GD como imagesx() e imagesy() para obtener el ancho y el alto de la imagen cargada. 

Al final de mi último tutorial de GD, aprendiste a usar la biblioteca para automatizar tareas básicas como cambiar el tamaño de todas las imágenes en un directorio o aplicar filtros como escala de grises en ellas antes de guardar el resultado final. Si nuncas has usado la biblioteca PHP GD antes, te sugiero que leas el artículo introductorio de GD antes de leer este. 

En este tutorial, conoceremos muchas más funciones útiles en GD y cómo se pueden usar para automatizar más de nuestras tareas de manipulación de imágenes. 

Manipulación de Imágenes Usando una Matriz de Convolución 

A excepción de los píxeles en los bordes, cada píxel de una imagen está rodeado por otros ocho píxeles. Los efectos como el desenfoque o la detección de bordes se calculan para cada píxel según el valor de ese píxel y los valores de los píxeles circundantes.   En la detección de bordes, por ejemplo, un cambio brusco en el color implica que hemos alcanzado el borde de algún objeto en la imagen. Por ejemplo, un cambio repentino de blanco a marrón en la imagen de abajo significará el límite de la taza y la mesa. 

Una forma fácil de especificar este tipo de filtro es con lo que se llama una "matriz de convolución". GD proporciona la función imageconvolution ($image, $matrix, $div, $offset) para aplicar una matriz de convolución 3x3 a un recurso de imagen $image

El parámetro $matrix es una matriz de tres matrices, cada una de las cuales contiene tres valores flotantes, es decir, Es una matriz de 3x3. El primer elemento de la primera matriz se multiplica por el valor del color del píxel superior izquierdo.  Del mismo modo, el segundo elemento de la primera matriz se multiplica por el valor del color del píxel directamente sobre el píxel central.  El color final del píxel se obtiene al agregar el resultado de todas estas multiplicaciones y luego dividirlo por $div para la normalización. La normalización generalmente mantiene el valor del color final por debajo de 255. 

Como hemos visto, el parámetro $div se usa como un divisor para que el resultado de la convolución normalice su valor.  El parámetro $offset, por otro lado, se usa para especificar un valor de desplazamiento para todos los colores. Verás cómo afecta el resultado final en los ejemplos a continuación.

Ejemplos de Convolución

Aquí hay una lista de algunas matrices de convolución diferentes que hemos aplicado a la imagen de una taza en una tabla.

Desenfoque de Caja

El desenfoque de caja funciona simplemente promediando cada píxel con sus vecinos. Establecemos el valor del divisor en 9 porque la suma de todos los elementos en las tres matrices es 9.

Agudizar

Agudizar funciona exagerando las diferencias entre cada píxel y sus vecinos. Esto hace que los bordes sean un poco más claros. En el caso de agudizar, el divisor sigue siendo 1 porque la suma de todos los elementos en las tres matrices es 1.

Realzar

La matriz de realzar es similar a la matriz de agudizar, excepto que los valores son negativos en la parte superior izquierda y positivos en la parte inferior derecha; eso es lo que crea el efecto de relieve. La suma de todos los elementos en el caso de la matriz de convolución de relieve es 1, por lo que no debemos preocuparnos por la normalización o el desplazamiento del color.

Detección de Bordes

La detección de bordes es similar a la de agudizar, pero el efecto es aún más fuerte. Además, el valor original de la imagen no tiene más peso que los vecinos, lo que significa que solo nos preocupamos por los bordes, no por las áreas de colores sólidos originales.

Con la detección de bordes, la suma de todos los elementos de la matriz es 0. Esto significa que la imagen que obtendremos será mayormente negra a menos que haya un cambio agudo en el color, que generalmente ocurre en los bordes de los objetos. La imagen en su mayoría negra se puede convertir en blanco configurando el parámetro de compensación en 255.

La siguiente imagen muestra el resultado de todas estas matrices de convolución.

Convolution MatrixConvolution MatrixConvolution Matrix

Funciones de Copia de Imagen

PHP GD tiene muchas funciones para copiar parte de una imagen y luego redimensionarla o fusionarla. Al usar estas funciones, es importante recordar que PHP considera el origen de la esquina superior izquierda de un recurso de imagen. Un valor de x positivo lo llevará a la derecha de la imagen, y un valor de y positivo lo llevará más abajo.

La más simple de estas funciones es imagecopy ($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h). Copiará la imagen de origen en una imagen de destino.  Los parámetros $dst_x y $dst_y determinan la esquina superior izquierda, donde se pegará la imagen copiada. Los parámetros $src_x, $src_y, $src_w y $src_h determinan la parte rectangular de la imagen de origen, que se copiará al destino.

Puedes usar esta función para recortar imágenes creando una imagen desde cero utilizando imagecreatetruecolor() y copiando en ella el rectángulo de recorte de la imagen de origen. También puedeS usarlo para agregar marcas de agua en las imágenes, pero debeS recordar que con este método, el tamaño de la marca de agua no se puede cambiar de acuerdo con el tamaño de nuestras imágenes.

Una solución a este problema es usar la función imagecopyresized ($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $dst_w, $dst_h, $src_w, $src_h). Acepta todos los parámetros de imagecopy() y dos parámetros adicionales para determinar el tamaño del área de destino donde se copiará la imagen de origen.

La función imagecopyresized() no es perfecta, ya que no escala la imagen hacia arriba y hacia abajo muy bien. Sin embargo, puede obtener un mejor tamaño de calidad utilizando la función imagecopyresampled(), que acepta todos los mismos parámetros.

Copiar Con Transparencia

Hay dos funciones más relacionadas con la copia de imágenes que te serán muy útiles: imagecopymerge() e imagecopymergegray().

La función imagecopymerge ($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct) es similar a imagecopy(), donde el parámetro adicional de $pct determina la transparencia de la copia. imagen. Un valor de 0 significa que no hay transparencia, y un valor de 100 significa transparencia completa.Esto será de gran ayuda cuando no quiera ocultar completamente el contenido de la imagen principal detrás de su marca de agua.

La función imagecopymergegray(), por otro lado, utiliza el último parámetro para convertir la imagen de origen a escala de grises. Si se establece en 0, la imagen de origen perderá todo su color. Si se establece en 100, la imagen de origen no se verá afectada.

Ejemplo de Copia de Imagen

El siguiente ejemplo utiliza la función imagecopy() para convertir la mitad derecha de una imagen en su negativo. Ya hemos analizado otras funciones como imagefilter() y imagescale() utilizadas en este fragmento de código en el tutorial anterior.

Aquí, creamos dos copias de la imagen original, cada una de las cuales se ha reducido a 800 píxeles de ancho. Después de eso, usamos la función imagefilter() para crear un negativo del recurso de imagen $img_php_inv.  La mitad derecha de esta imagen negativa se copia en la imagen original mediante la función imagecopy().

Este fue un uso muy básico de la función imagecopy(). Puedes ver los resultados a continuación. También puede dividir la imagen en secciones o bandas más pequeñas para crear efectos de imagen más interesantes.  Usaremos la función imagecopymergegray() en el fragmento de código a continuación para crear muchas más franjas en la imagen del pez original.

El ejemplo del código anterior utiliza una estrategia similar al ejemplo anterior, pero esta vez dividimos la imagen en franjas más pequeñas, que se convierten en escala de grises o se mantienen sin cambios según el valor de la variable $i. Después de completar todas las operaciones de combinación de copia, aplicamos dos filtros en la imagen para que las franjas se destaquen.

La siguiente imagen muestra el resultado final de estas dos funciones junto con diferentes filtros de imagen.

PHP GD Fish MosaicPHP GD Fish MosaicPHP GD Fish Mosaic

Incrustación de Marcas de Agua u otra Información en Imágenes

Algunas organizaciones agregan marcas de agua a sus imágenes para dejar claro que son dueños de la imagen.  También ayuda con el reconocimiento de la marca y desalienta a otras personas a copiar las imágenes descaradamente. Gracias a PHP GD, las imágenes de marca de agua son una tarea sencilla.

En el fragmento de código anterior, hemos creado dos recursos de imagen diferentes usando imagecreatefromjpeg() para la imagen principal e imagecreatefrompng() para la marca de agua respectivamente. Determinamos el ancho y el alto de la imagen principal usando las funciones imagesx() y imagesy().

No todas las imágenes que desea incluir en la marca de agua tendrán las mismas dimensiones. Si no cambia el tamaño de la marca de agua según las dimensiones de la imagen principal, puede parecer extraño. Por ejemplo, una marca de agua de 200px puede verse bien en una imagen de 1000px, pero será demasiado grande para una imagen de 600px de ancho, y podría parecer demasiado pequeña en una imagen de 2400px de ancho.

Por lo tanto, usamos la función imagescale() para mantener siempre la marca de agua en un quinto del ancho de la imagen original. Luego usamos la función imagecopy() para colocar la marca de agua en la ubicación correcta. Aquí está el resultado final del fragmento de código anterior.

Add Watermark to Images using GDAdd Watermark to Images using GDAdd Watermark to Images using GD

Además de las marcas de agua, también puedes agregar otra información como el lugar donde se tomó una fotografía o la hora en que se tomó una fotografía.

Pensamientos Finales

Después de cubrir los conceptos básicos de la manipulación de imágenes en nuestro tutorial anterior, aprendimos sobre algunas otras funciones útiles en la biblioteca de GD. La primera parte del tutorial discutió cómo podemos manipular imágenes en PHP usando la matriz de convolución.  También mostré algunos ejemplos de la operación de matriz de convolución para ayudarte a comprender cómo PHP llega a los valores de color de diferentes píxeles.

La segunda parte del tutorial explica cómo copiar y / o cambiar el tamaño de parte de una imagen para pegarla en otro lugar. Esto es útil cuando queremos agregar algo a una imagen como una marca de agua o una marca de tiempo.

¡Intenta usar todas estas funciones para crear algunos efectos de imagen interesantes!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
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.