<?php
	//////////////////////////////////////////////////////////////////////////////////
	//										//
	//   Rafael Páez - @fikih888  							//
	//   LSB - Least Significant Bit (3/3)						//
	//   Script que permite obtener un fichero ocultado en una imagen mediante LSB	//
	//										//
	//////////////////////////////////////////////////////////////////////////////////

	if($argc!=4)
	{
		echo "\n  Modo de empleo: obtener.php recorrido[filas/columnas] imagen_portadora archivo_salida\n\n";
	}
	else
	{
		//Obtenemos los argumentos
		$recorrido=$argv[1];
		$nombre_imagen=$argv[2];
		$nombre_archivo_salida=$argv[3];

		if($recorrido != "filas" && $recorrido != "columnas")
		{
			echo "\n  El tipo de recorrido no es correcto! Especifica \"filas\" o \"columnas\".\n\n";
		}
		else
		{
			echo "\n  Procesando........\n";

			//Leemos la imagen de entrada
			$archivo_imagen=imagecreatefrompng($nombre_imagen);

			/////////////////////
			// Procedemos a obtener el archivo oculto

			echo "  Obteniendo........\n";

			$archivo_salida=fopen($nombre_archivo_salida,"w");
			$rgb_lsb="";

			if($recorrido=="filas")
			{	
				$xmax=imagesx($archivo_imagen);
				$ymax=imagesy($archivo_imagen);
			}
			else
			{
				$xmax=imagesy($archivo_imagen);
				$ymax=imagesx($archivo_imagen);
			}

			//Recorremos todos los pixeles de la imagen portadora por filas/columnas
			for($y=0;$y<$ymax;$y++) 
			{
				for($x=0;$x<$xmax;$x++) 
				{
					//Obtenemos el color rgb del pixel
					if($recorrido=="filas")
					{
						$rgb=imagecolorat($archivo_imagen, $x, $y);
					}
					else
					{
						$rgb=imagecolorat($archivo_imagen, $y, $x);
					}

					//Obtenemos el último bit de cada color
					$r_lsb=($rgb >> 16) & 1;
					$g_lsb=($rgb >> 8) & 1;
					$b_lsb=$rgb & 1;

					//Guardamos los 3 bits en una cadena
					$rgb_lsb .= $r_lsb.$g_lsb.$b_lsb;
				}
			}

			/////////////////////
			// Procedemos a crear el archivo oculto

			$longi = strlen($rgb_lsb);
			for($i=0;$i<$longi;$i+=8)
			{
				$aux = "";
				for($j=0;$j<8;$j++) 
				{
					if(($i+$j)<$longi)
					{
						$aux .= $rgb_lsb[$i+$j];
					}
				}
				$aux = bindec($aux);
				$aux = chr($aux);

				fputs($archivo_salida, $aux);
			}

			ImageDestroy($archivo_imagen);
			fclose($archivo_salida);

			echo "\n  Archivo oculto obtenido correctamente! :)\n";
		}
	}
?>