Crear una imagen combinando varias imágenes PNG en PHP

Ya sea para hacer marcas de agua o bien para añadirle un sello a una imagen, podemos combinar imágenes al vuelo utilizando GD que viene ya incluido en la mayoría de distribuciones con PHP.

Antes que nada debemos tener en cuenta que el formato de imagen a utilizar ha de ser PNG, que nos brinda un canal alpha de transparencia y hará que quede mucho mejor. Creamos una clase ImagenEnCapas, a la que la vayamos agregando capas medianteImagenEnCapas->agregarCapa() y que finalmente renderizaremos una nueva imagen combinando imágenes utilizando ImagenEnCapas->obtenerImagen().

El código

Haremos un index.php que imprimirá la imagen en capas:

<?php //index.php
include "imagenEnCapas.php"; //creo una imagen por capas de 327x66 
$imagen = new ImagenEnCapas(327,66); //agrego 3 capas 

$imagen->agregarCapa('imagenes/fondo.png');
$imagen->agregarCapa('imagenes/dibujo.png');
$imagen->agregarCapa('imagenes/letras.png');

//retorno la imagen
$imagen->obtenerImagen();

Ahora bien, no será parte de este tutorial, pero se puede enmascarar el php para que para el usuario sea un archivo png y no reconozca que hay una ejecución de código por detrás.

Podemos ver como es la clase que gestiona las capas:

<?php //imagenEnCapas.php

class ImagenEnCapas{

	private $capas = array();
	private $ancho;
	private $alto;

	public function __construct($w,$h){
		$this->ancho = $w;
		$this->alto = $h;
	}

	public function agregarCapa($ruta_a_imagen){
		//guardo las rutas a las imagenes que quiero agregar
		$this->capas[] = $ruta_a_imagen;
	}

	public function obtenerImagen(){
		//crear una imagen nueva.
		$imagen_de_salida = imagecreatetruecolor($this->ancho, $this->alto);
		//indicar que se utilizar canal alpha para las transparencias
		imagealphablending($imagen_de_salida, true);
		imagesavealpha($imagen_de_salida, true);

		foreach ($this->capas as $capa) {
			//creo una imagen
			$imagen_capa = imagecreatefrompng( dirname(__FILE__) . '/' .  $capa );
			//la imprimo sobre la imagen actual (destino,origen,destino_x,destino_y,origen_x,origen_y,origen_width,origen_height)
			imagecopy($imagen_de_salida, $imagen_capa, 0, 0, 0, 0, $this->ancho, $this->alto);
		}
		//renderizar como png.
		header('Content-Type: image/png');
		imagepng($imagen_de_salida);
	}
}

Lo que hace es ir aplicando las capas a la imagen e imprimir una salida, como se muestra en esta imagen:demo

Limitaciones

Si bien, este es un ejemplo bastante sencillo y rápido, la clase que hemos creado tiene limitaciones ya hemos combinado imágenes de la misma medida para no acomplejar la cosa.

Código fuente

Os dejo el enlace al repositorio de Github donde podréis ver el código fuente completo.

Share on FacebookShare on Google+Tweet about this on TwitterShare on LinkedInShare on StumbleUpon
Pablo Oneto

Soy un desarrollador de software web especializado en PHP.

Deja un comentario