<?php
	//////////////////////////////////////////////////////////////////////////
	//									//
	//   Rafael Páez - @fikih888  						//
	//   LSB avanzado - Least Significant Bit (1/2)				//
	//   Script que permite ocultar una imagen bicolor en otra 		//
	//   mediante la técnica LSB						//
	//									//
	//////////////////////////////////////////////////////////////////////////

	if($argc!=6)
	{
		echo "\n  Modo de empleo: ocultar.php formato_portadora[jpeg/png] formato_oculta[jpeg/png] imagen_portadora imagen_a_ocultar imagen_resultante\n\n";
	}
	else
	{
		//Obtenemos los argumentos
		$tipo_imagen=$argv[1];
		$tipo_imagen_oculta=$argv[2];
		$nombre_portadora=$argv[3];
		$nombre_oculta=$argv[4];
		$nombre_salida=$argv[5];

		if($tipo_imagen != "jpeg" && $tipo_imagen != "png")
		{
			echo "  El formato de la imagen de entrada no es correcto! Especifica \"jpeg\" o \"png\".\n\n";
		}
		if($tipo_imagen_oculta != "jpeg" && $tipo_imagen_oculta != "png")
		{
			echo "  El formato de la imagen de entrada no es correcto! Especifica \"jpeg\" o \"png\".\n\n";
		}
		else
		{
			echo "\n  Procesando........\n";


			/////////////////////
			// Procedemos a ocultar la imagen

			//cargamos imagen portadora
			if($tipo_imagen=="jpeg")
			{
				$archivo_imagen=imagecreatefromjpeg("$nombre_portadora");
			}
			else
			{
				$archivo_imagen=imagecreatefrompng("$nombre_portadora");
			}

			//cargamos imagen a ocultar
			if($tipo_imagen_oculta=="jpeg")
			{
				$archivo_imagen_oculta=imagecreatefromjpeg("$nombre_oculta");
			}
			else
			{
				$archivo_imagen_oculta=imagecreatefrompng("$nombre_oculta");
			}
			

			//comprobamos tamanyo imagenes
			$xmax_portadora=imagesx($archivo_imagen);
			$ymax_portadora=imagesy($archivo_imagen);
			$xmax_oculta=imagesx($archivo_imagen_oculta);
			$ymax_oculta=imagesy($archivo_imagen_oculta);

			if($xmax_portadora < $xmax_oculta || $ymax_portadora < $ymax_oculta)
			{
				echo "\n  Error! La imagen a ocultar es demasiado grande para la imagen portadora.\n";
				echo "Dimensiones imagen portadora: $xmax_portadora x $ymax_portadora \n";
				echo "Dimensiones imagen a ocultar: $xmax_imagen_oculta x $ymax_imagen_oculta \n";
			}
 			else
			{
				echo "  Ocultando.........\n";
				$imagen_nueva=ImageCreatetruecolor($xmax_portadora, $ymax_portadora);


				//Recorremos todos los pixeles
				for($y=0;$y<$ymax_portadora;$y++)
				{
					for($x=0;$x < $xmax_portadora;$x++)
					{
						if($x < $xmax_oculta && $y < $ymax_oculta)
						{
							//Obtenemos el color rgb del pixel a ocultar
							$rgb=imagecolorat($archivo_imagen_oculta, $x, $y);

							//si no es blanco puro modificamos el color (16777215 = color blanco en rgb)
							if($rgb != 16777215) 
							{
								$rgb_original=imagecolorat($archivo_imagen, $x, $y);

								$rnew=($rgb_original >> 16) & 0xFF; 
								$gnew=($rgb_original >> 8) & 0xFF;  
								$bnew=$rgb_original & 0xFF; 

								//modificamos el lsb
								if($rnew!=0)
									$rnew=$rnew-1;
								else 
									$rnew=$rnew+1;
								if($gnew!=0)
									$gnew=$gnew-1;
								else
									$gnew=$gnew+1;
								if($bnew!=0)
									$bnew=$bnew-1;
								else
									$bnew=$bnew+1;

								//Creamos el rgb nuevo
								$rgbnew = ($rnew << 16);
								$rgbnew = $rgbnew | ($gnew << 8);
								$rgbnew = $rgbnew | $bnew;

								//Imagesetpixel($imagen_nueva,$x,$y,0xf61e1e);
								Imagesetpixel($imagen_nueva,$x,$y,$rgbnew);
							}
							else
							{
								//se deja el mismo color del pixel original
								$rgb_original=imagecolorat($archivo_imagen, $x, $y);
								Imagesetpixel($imagen_nueva,$x,$y,$rgb_original);
							}
						}
						else
						{
							//se deja el mismo color del pixel original
							$rgb_original=imagecolorat($archivo_imagen, $x, $y);
							Imagesetpixel($imagen_nueva,$x,$y,$rgb_original);
						}
					}
				}

				//Creamos la imagen
				ImagePng($imagen_nueva,$nombre_salida);  
			
				ImageDestroy($imagen_nueva);
				ImageDestroy($archivo_imagen);
				ImageDestroy($archivo_imagen_oculta);

				echo "\n  Imagen ocultada correctamente! :)\n\n";
			}
		}
	}
?>