Marcas de agua automáticas con PHP y GD

Escrito por Federico H. García el Jueves 05 de Mayo de 2005 a las 00:00hs

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...

<?php

$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.


comentarios



  1. Estoy pez en esto de PHP, así antes de nada perdón por mi ignorancia o atrevimiento en preguntar algo, que pudiera trivial. Tengo conocimientos de Javascript y empezando ahora con el aprendizaje de PHP. Veo similitudes en ambos lenguajes por lo que siempro tiendo a analizar el código tratanto de vislumbrar que es lo que significa. En este caso se me dio por plantearme la cuestión siguiente: ¿Es posible colocar dicha marca de agua en una esquina de la imagen, por ejemplo en la esquina inferior derecha? ¿O siempre tiene que estar centrada? ¿Cual es el trozo de código que maneja dicho parametro?
    De antemano, gracias por tu tiempo y paciencia. Saludos y enhorabuena por el renovado diseño (hace tiempo que no me pasaba)



  2. yo no entiendo q es una marca de agua . expliquen



  3. Y PARA LOS QUE QUIERAN UN PROGRAMA QUE PONGA MARCAS DE AGUA AUTOMATICAMENTE A VARIAS FOTOS O UNA SOLA, LES RECOMIENDO QUE BUSQUEN EN EL GOOGLE, ESCRIBAN MARCA DE AGUA Y APARECERAN VARIAS DIRECCIONES....O BUSQUEN EN SOFTONIC....NO SEAN FLOJOS, CUANDO NO SEPAN ALGO USEN EL GOOGLE, PRIMERO AGOTEN TODOS LOS RECURSOS QUE OFRECE INTERNET, Y SI NO OBTIENEN RESULTADOS, ENTONCES AHI RECIEN PIDAN AYUDA...EL GOOGLE ES UNA BUENA HERRAMIENTA DE BUSQUEDA Y ENCUENTRA CASI TODO.
    Y PARA EL QUE PREGUNTA , QUE ES UNA MARCA DE AGUA LE RESPONDO QUE BUSQUES EN EL GOOGLE O HAGAS UN GRAN ESFUERZO HACIENDO CLIC EN EL LINK QUE DI MAS ARRIBA Y APRENDERAS ALGO MAS SOBRE TU DUDA...
    MAS FACIL NO PUEDE SER CIERTO ???



  4. A mi no me tira :D



  5. hola me parece muy bien el codigo lo probe, pero tengo una duda si la marca de agua se puede hacer cuando quieran guardar la foto en su pc, que la marca de agua no aparesca cuando muestro la imagen enuna consulta por ejemplo me muestre la foto normal, .



  6. necesito hacer correr php en windows hace dos semanas que no puedo solo corre el html y nada el php como puedo solucionar mi problema le agradeceria mucho que me ayude



  7. se puede poner marcas de agua a una imagen PNG de este mismo modo ?

  8. Tecnico en Sistemas y Redes:
    Sabado 05 de Abril de 2008 a las 12:48hs


    CORRER PHP EN WINDOWS

    Respecto a la pregunta de correr un sitio php en Windows, principalmente necesitas un gestor o un motor que pueda ejecutar las aplicaiones html y que al mismo tiempo incluyen o poseen codigo php en la pagina, sino solo aparece el html pro hay programas que simulan tener un pequeño servidor php que levantas esas aplicaciones y yo te recomendaria PhpMyAdmin el cual es libre y puedes instalarlo en tu Pc para probar tus aplicaiones, espero te ayude en algo sino especifica que quieres hacer realmente y veremos que hacer.

    Samuel Tecnico en Sistemas y Redes Informaticas



  9. amigo. me parecio exelente el codigo..

    bueno probandolo me funciono muy bien..
    tengo una duda.. porque por lo que me di cuenta. esto no graba una imagen con el sello de agua sino. solo te la fuciona.. porque no crea ninguna imagen especial...
    solo pone el sello sobre la original.. pero si alguien averigua la direccion real de la imagen igual la podrian copiar sin el sello..
    mi consulta es.. es posible ademas guardar esta imagen??
    reemplazar la original y guardarla.??


    salu2



  10. He recorrido google y aun no doy.... me sirve de granb ayuda este codigo pero no lo puedo aplicar y aun no encuentro la forma para colocarla a imagenes de resultados de busquedad como por ejemplo una url como esta: http://www.906090.com.ec/im.php?id=11326 como eran no termina en image.jpg o nombre de imagen.gif, como podria aplicar a direcciones como esta...... Esto es para alicarlo en mi web www.906090.com.ec..


    Saludos



  11. DUda, funciona bien y demas, pero... como hago para q funcione con los gif? y png o demas... solo funciona en jpg, el resto me sale en blanco, solucion?

    Gracias



  12. el tecnico en redes que dijo que PHPMYADMIN es un servidor favor de estudiar mas... gracias... o googlear mas... o simplemente no hablar...

agregar comentario


Se permiten las etiquetas HTML <b>, <i> y <p>. Si ingresa alguna dirección web o dirección de email serán convertidos en enlaces automáticamente.





publicidad