El Orden del caos: Procesamiento de imágenes en PHP

El Orden del caos: Procesamiento de imágenes en PHP

PHP como ya sabrán es un lenguaje scripting orientado al desarrollo de páginas web dinámicas (Pero seamos sinceros la utilización de este lenguaje a nivel web es asqueroso, en cambio a nivel CLI es un poco más juakeroso y geek). PHP trae consigo unos módulos (algo parecido a Perl sólo que de una manera menos complicada) que sirven desde el procesamiento de texto, manejo de audio, conexiones por sockets, procesamiento de imágenes, crypt y muchos más visajes bizarros.

Aquí nos enfocaremos sólo al nivel de procesamiento de imágenes con el modulo (o librería) GD, esta librería este escrita en lenguaje C, soporta varios formatos y tiene funciones para el manejo de exif (jodidamente bueno a la hora manejar metadatos).

La estructura para implementar GD a la hora de generar imágenes es de la siguiente manera:

  1. Crear header
  2. Crear imagen
  3. Setear colores
  4. Crear contenido de la imagen
  5. Dar salida a fichero
  6. Eliminar Imagen “Volátil”

Para no dar tanta teoría que a veces se convierte en algo poco agradable lo explicaré con código:

<?php
header("Content-type: image/jpeg");
/*Crear Header
la función header es para definir el formato
de alguna salida o algun procesamiento que
hagamos, por ahora solo bastara con el de
image/jpeg
*/

$FileImagen=imagecreatetruecolor($argv[1],$argv[2]);
/*Crear Imagen
la funcion imagecreatetruecolor, crea la imagen
retornando un puntero donde se encuentra en
memoria dicha imagen, argv[1] es el ancho de
la imagen y argv[2] es el alto de la imagen
*/

$Blanco=imagecolorallocate($FileImage,0xff,0xff,0xff);        /*Setear Colores
la funcion imagencolorallocate, pide como
parámetros el puntero de la imagen, y la
representación del color en entero o hex
*/

imagestring($FileImage, 5, 0, 0, 'Where is my Fucking mind?', $Blanco;
/*Crear Contenido de la imagen
en esta parte es donde se va a hacer todo
el procesamiento y modelamiento del contenido
de la imagen, podemos utilizar funciones
predefinidas o crearlas nosotros mismos,
en esta linea invocamos la función
imagestring que dibuja un string
en las coordenadas X y Y que definamos
*/

imagejpeg($FileImage,"OutImage.jpeg");
/*Dar salida a fichero
esta función retorna la salida del fichero
solo pide el puntero de la imagen y el
nombre de salida de la imagen
*/

imagedestroy($FileImage);
/*Eliminar Imagen Volátil
elimina de memoria la imagen,
solo pide como parámetro el puntero
de la imagen
*/
?>

Ya con esa estructura, una birra y la guía de referencia de la librería GD a la mano se pueden hacer las mil y una loqueras mentales. Ahora vamos a ver algunos de los pajasosmentales  pensamientos que me han salido con la combinación anterior.

El Orden del caos

<?php
header("Content-type: image/jpeg");                /*Creando Header de la Imagen*/
$FileImage=imagecreatetruecolor(500,500);            /*Creando Imagen*/
$Verde(imagecolorallocate($FileImage,0x00,0xff,0x00));        /*Seteando colores*/
$Points=$argv[1];
$i=0;
$FuckPoints[0]=0;
while($i<$Points){                        /*Generando puntos aleatorios*/
$FuckPoints[$i]=rand(20,495);
$FuckPoints[$i+1]=rand(20,495);
$i=$i+2;
}
imagepolygon($FileImage,$FuckPoints,($Points/2),$Verde);    /*Crear contenido de la imagen*/
imagejpeg($FileImage,"FuckThisShit.jpeg");            /*Dar Salida a la Imagen*/
imagedestroy($FileImage);                    /*Destruir Imagen*/
?>

El orden del caos, a varias personas les ha llamado la atención haya el orden del caos pero es jodidamente difícil, este código salió de una prueba con las funciones de GD lo que hace prácticamente es generar un par de puntos (X – Y) y pasárselos a la función imagepolygon dicha función grafica polígonos irregulares con cierta cantidad de puntos que uno le pase por argumentos.

Procesamiento

$Points=$argv[1];
$i=0;
$FuckPoints[0]=0;

La variable Points es la cantidad de par de puntos que generara e inicializamos una variable de control para el while donde se generaran los puntos, el array FuckPoints es el array donde estarán almacenados los puntos generados aleatoriamente.

    $FuckPoints[$i]=rand(20,495);
$FuckPoints[$i+1]=rand(20,495);
$i=$i+2;

La primera línea guarda en la primera posición un punto entre 20 y 495 y la segunda línea hace lo mismo sólo que con una posición adelante de la anterior y aumentamos 2 subíndices para poder seguir con la generación normal sin eliminar alguno de los puntos creados anteriormente.

imagepolygon($FileImage,$FuckPoints,($Points/2),$Verde);

Ahora le invocación de la función que dibuja el polígono irregular, esta función pide como parámetros el puntero de la imagen ($FileImage), el array donde están los puntos ($FuckPoints) , la cantidad de puntos ($Points/2) y el color que en el cual se dibujara el polígono. Resultado:

Triping Image

<?php

/*php Script.php ancho alto*/
header("Content-type: image/gif");                                                /*Crear Header*/
echo "[Creando Header]\n";
$FileImage=imagecreatetruecolor($argv[1],$argv[2]);                                        /*Crear Imagen */
echo "[Creando Imagen]\n";
$SetColor=array(imagecolorallocate($FileImage,0x8a,0x08,0x08),imagecolorallocate($FileImage,0x8a,0x29,0x08),            /*Seteando colores*/
imagecolorallocate($FileImage,0x8a,0x4b,0x08),imagecolorallocate($FileImage,0x86,0x8a,0x08),
imagecolorallocate($FileImage,0x8a,0x4b,0x08),imagecolorallocate($FileImage,0x86,0x8a,0x08),
imagecolorallocate($FileImage,0x68,0x8a,0x08),imagecolorallocate($FileImage,0x4b,0x8a,0x08),
imagecolorallocate($FileImage,0x29,0x8a,0x08),imagecolorallocate($FileImage,0x08,0x8a,0x08),
imagecolorallocate($FileImage,0x08,0x8a,0x29),imagecolorallocate($FileImage,0x08,0x8a,0x4b),
imagecolorallocate($FileImage,0x08,0x8a,0x68),imagecolorallocate($FileImage,0x08,0x8a,0x85),
imagecolorallocate($FileImage,0x08,0x6a,0x87),imagecolorallocate($FileImage,0x08,0x4b,0x8a),
imagecolorallocate($FileImage,0x08,0x29,0x8a),imagecolorallocate($FileImage,0x08,0x08,0x8a),
imagecolorallocate($FileImage,0x29,0x08,0x8a),imagecolorallocate($FileImage,0x4b,0x08,0x8a),
imagecolorallocate($FileImage,0x6a,0x08,0x88),imagecolorallocate($FileImage,0x61,0x0b,0x5e),
imagecolorallocate($FileImage,0x8a,0x08,0x68),imagecolorallocate($FileImage,0x8a,0x08,0x4b),
imagecolorallocate($FileImage,0x8a,0x08,0x29),imagecolorallocate($FileImage,0x42,0x42,0x42));
echo "[Seteando colores]\n";
$SetColorNeutro=imagecolorallocate($FileImage,0x00,0x00,0x00);                                    /*Seteando color Negro*/
$MargenY1=$MargenX1=7;
$MargenX2=$argv[1]-7;
$MargenY2=$argv[2]-7;
$FlagSet=1;
/*Creando Contenido de Imagen*/
echo "[Start Procesamiento Imagen]\n";

do{
if(($FlagSet%2)==0){
imagefilledrectangle($FileImage,$MargenX1,$MargenY1,$MargenX2,$MargenY2,$SetColorNeutro);
}
elseif($FlagSet%2!=0){
imagefilledrectangle($FileImage,$MargenX1,$MargenY1,$MargenX2,$MargenY2,$SetColor[rand(0,25)]);
}
$FlagSet=$FlagSet+1;
$MargenY1=$MargenY1+7;
$MargenX1=$MargenX1+7;
$MargenX2=$MargenX2-7;
$MargenY2=$MargenY2-7;
}while($FlagSet*7<($argv[1]/2));
/*Dar salida a la imagen*/
imagegif($FileImage,"OutFucked.gif");
echo "[Creando Archivo OutFucked.gif]\n";
/*Destruir imagen*/
imagedestroy($FileImage);
echo "[Eliminando Imagen]\n";
?>

Este código al “soyarme” con un poco de Geometría Abstracta, este tema tiene un poco a sabor de fractales sólo que de una manera tan bizarra como los propios fractales, le idea es jugar con figuras geométricas (en este caso Rectángulos) para crear una imagen que maree un poco con tan sólo verla o que cumpla un patrón.

Como ven en la estructura de la misma que utilizamos en la Introducción, sólo que el procesamiento de la imagen y el seteo de colores.

Seteo de colores

En el seteo de colores utilizamos un array para definir 26 tipos de colores en una gama oscura cada espacio del array guardara un colores diferente, el color se lo definimos en hexadecimal con la función imagecolorallocate($PunteroImagen,0x00,0x00,0x00), no tiene mucha ciencia sólo es manejar el subíndice desde 0 hasta 25 y empieza desde amarillo hasta terminar en gris.

Procesamiento

    $MargenY1=$MargenX1=7;
$MargenX2=$argv[1]-7;
$MargenY2=$argv[2]-7;
$FlagSet=1;

Definimos la margen que será color negro y tendrá 7 pixeles tanto de ancho como de alto entonces el punto uno está definido por MargenX1 y MargenY1 que es el quedara en abajo en la parte izquierda de la imagen y el segundo punto está definido por MargenX2 y MargenY2 que quedare en la parte superior a la derecha de la imagen, definimos FlagSet que será la cantidad de rectángulos que se pueden generar en la imagen (lo veremos en la condición do while).

if(($FlagSet%2)==0){
imagefilledrectangle($FileImage,$MargenX1,$MargenY1,$MargenX2,$MargenY2,$SetColorNeutro);
}
elseif($FlagSet%2!=0){
imagefilledrectangle($FileImage,$MargenX1,$MargenY1,$MargenX2,$MargenY2,$SetColor[rand(0,25)]);
}
$FlagSet=$FlagSet+1;

Ya estamos dentro del do while y utilizamos este if anidado para hacer el patrón de cuales serán los rectángulos negros y los rectángulos con la gama de colores oscuros definidos anteriormente, si FlagSet es par será colores negro y si es impar será de colores, y aumentamos el FlagSet.

    $MargenY1=$MargenY1+7;
$MargenX1=$MargenX1+7;
$MargenX2=$MargenX2-7;
$MargenY2=$MargenY2-7;

Estas cuatro líneas lo que hacen es hacer más pequeño el rectángulo el punto 1 que aumentara de posiciones de pixel tanto en Y como en X y el punto dos disminuirá en las dos coordenadas para el rectángulo se haga más pequeño y quedaran las nuevas coordenadas del próximo rectángulo.

    while($FlagSet*7<($argv[1]/2));

Esta condición solo hace el control de cuantos rectángulos se van a generar, como argv[1] es el ancho de la imagen lo dividimos en dos para que quede la mitad del ancho de la imagen y FlagSet será multiplicado por 7 (que es el ancho de cada rectángulo entre sí, para que haya una secuencia estable) y se repetirá N veces hasta que Flagset*7 sea menor que el ancho de la imagen. Resultado:

La Utilización de esta librería tiene muchísimas aplicaciones, desde crear un editor de imágenes por comandos (que hermoso y geek sería eso), hasta cifrar imágenes desde un punto de vista gráfica, solo es cuestión de imaginación y lógica.

Artículos Relacionados

Una mirada a Symfony: Cambiando la cultura del desarrollo plano

1 Comentario

  1. Imagen de perfil de UrbaN77

    UrbaN77 - mayo 7, 2012, 1:41 pm Responder

    “Pero seamos sinceros la utilización de este lenguaje a nivel web es asqueroso” Urban ofendido xDDDD chevere el asunto, me quedó sonando lo de cifrar imágenes.

Deja un comentario

Tu email no será publicado.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*