<?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";
}
}
}
?>