Marcas de agua automáticas con PHP y GD
En todos los foros dedicados al desarrollo web hay por lo menos un thread dedicado al tema de proteger al contenido del sitio web o su código fuente de ser guardado por el usuario. Si bien existen varios programas que ocultan el código (e incluso algunos llegan a prohibir los clicks del botón derecho del mouse), siempre se llega a la conclusión de que proteger el contenido de un sitio es imposible (protegerlo para todos los usuarios, claro que siempre se pueden usar métodos de autenticación).
Lo mismo pasa con las imágenes: se pueden guardan desde los temporales (suponiendo que por algún extraño motivo no se pueda desde el browser directamente), o simplemente haciendo una captura de pantalla.
En conclusión, todo lo que llega a la pantalla del usuario le pertenece y puede hacer con eso lo que quiera.
Sin embargo, lo que se suele hacer a la hora de proteger imágenes es aplicarles una marca de agua, es decir, una imágen translúcida que indica que la imágen no puede ser usada en otro sitio, para fines comerciales, etc.
Y es ahí donde la librería GD para tratamiento de imágenes entra en juego. Usando dicha librería, un poco de PHP y la magia de los PNG's se puede automatizar la tediosa tarea de aplicar marcas de agua a diferentes imágenes.
Primero es necesario crear una marca de agua en formato PNG. La ventaja principal de éste formato (indispensable en este caso) es que permite 255 niveles de transparencias, por lo que se puede lograr una imágen translúcida.
Una vez creada la marca, se puede aplicar en la imágen usando PHP. Pueden ver el código aqui...
$image = $_GET['i'];
$watermark = "water.png";
$im = imagecreatefrompng($watermark);
$ext = substr($image, -3);
if(strtolower($ext) == "gif") {
if (!$im2 = imagecreatefromgif($image)) {
echo "Error opening $image!";
exit;
}
} else if(strtolower($ext) == "jpg") {
if (!$im2 = imagecreatefromjpeg($image)) {
echo "Error opening $image!";
exit;
}
} else if(strtolower($ext) == "png") {
if (!$im2 = imagecreatefrompng($image)) {
echo "Error opening $image!";
exit;
}
} else {
die;
}
imagecopy($im2, $im, (imagesx($im2)/2)-(imagesx($im)/2), (imagesy($im2)/2)-(imagesy($im)/2), 0, 0, imagesx($im), imagesy($im));
if($_GET[repeat]) {
$waterless = imagesx($im2) - imagesx($im);
$rest = ceil($waterless/imagesx($im)/2);
for($n=1; $n<=$rest; $n++) {
imagecopy($im2, $im, ((imagesx($im2)/2)-(imagesx($im)/2))-(imagesx($im)*$n), (imagesy($im2)/2)-(imagesy($im)/2), 0, 0, imagesx($im), imagesy($im));
imagecopy($im2, $im, ((imagesx($im2)/2)-(imagesx($im)/2))+(imagesx($im)*$n), (imagesy($im2)/2)-(imagesy($im)/2), 0, 0, imagesx($im), imagesy($im));
}
}
header("Content-Type: image/jpeg");
imagejpeg($im2);
imagedestroy($im);
imagedestroy($im2);
?>
Basta con pasarle la URL de la imágen a la cual se le desea aplicar la marca de agua a través de la URL...
watermark.php?i=brown_lady.jpg
También pueden probar pasándole la variable repeat para que repita la marca de agua horizontalmente...
watermark.php?i=brown_lady.jpg&repeat=t
Claro que es muy importante que restringan el acceso al directorio en donde se alojan las imágenes originales. Un simple .htaccess con la sentencia deny from all debería ser suficiente (en servers apache, claro).
Es importante tener en cuenta que el método no es infalible, cualquier persona con experiencia en el uso de un buen editor de imágenes puede remover la marca sin dejar rastro.










