Existe una función en algunas versiones de PHP5 que nos permite convertir imágenes de color a blanco y negro (escala de grises): imagefilter(). Pero ya que dicha función no está disponible en todos los servidores aún cuando puedan contar con la versión 5 de PHP o posteriores, es que les voy a mostrar una técnica sencilla no sólo para convertir imágenes de color a blanco y negro, sino también para virar las imágenes (darles un ligero tinte) y posterizarlas. Este técnica utiliza funciones que están disponibles desde la versión 4 de PHP, por lo que difícilmente tendremos problemas de incompatibilidad.

La función que vamos a utilizar es imagePaletteCopy(). Esta función copia la paleta de una imagen indexada (fuente) a otra (destino), forzando que la imagen destino utilice los mismos colores que la imagen fuente.

Supongamos que esta es la imagen que queremos convertir a escala de grises:

Cúpulas

Ahora necesitamos una imagen indexada de 256 tonos desde blanco hasta negro. En este caso utilizaremos una imagen de formato GIF la cual es muy fácil de crear. En PhotoShop comenzamos con una imagen en blanco de no menos de 256 pixeles de ancho. Utilizamos la herramienta de gradiente para pintar desde un extremo al otro con los colores negro y blanco. Después la convertimos a color indexado asignando 256 colores a la paleta. El resultado será similar al siguiente:

Escala Grises

No es forzoso indexar a 256 colores. Incluso más adelante podremos ver una imagen que sólo contiene 10 colores. Mientras más colores mayor será la calidad de la imagen. No olvidemos que a mayor calidad también será mayor el tiempo de transferencia.

Ya que tenemos las 2 imágenes, sólo resta crear nuestro código en PHP. Es muy importante que ambas imágenes sean indexadas. Ya que la primer imagen es un jpeg a 24 bits (color verdadero), tendremos primero que indexarla:


<?php

header( "Content-type: image/gif" );

// Obtenemos la imagen original
$imagen = imagecreatefromjpeg( "http://dominio.dns/ruta/imagen.jpg" );

// Convertimos la imagen a indexada
imagetruecolortopalette( $imagen, true, 256 );

// Esta será la imagen para la escala de grises
$escala = imagecreatefromgif( "http://dominio.dns/ruta/escala1.gif" );

// Copiamos la paleta de escala a la imagen
imagepalettecopy( $imagen, $escala );

imagedestroy( $escala );

imagegif( $imagen );

imagedestroy( $imagen );

?>

Este será el resultado al utilizar la paleta de la escala de grises en la imagen a colores:

Imagen Grises

Ahora, ¿qué sucederá si utilizamos una paleta distinta?

Les muestro diferentes resultados, cada uno con su respectiva paleta de colores:

Imagen Sepia
Escala Sepia
Imagen Azul
Escala Azul
Imagen Magenta
Escala Magenta