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

Sube Tu Queja

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. 298274818336917502974 From the official [URL=http://www.onlinemuslimitems.com/]Muslim Abaya[/URL] website of anticipated [URL=http://www.onlinemuslimitems.com/]Muslim Items[/URL] Star Wars The [URL=http://www.onlinemuslimitems.com/]Muslim hijab[/URL] Old Republic comes [URL=http://www.onlinemuslimitems.com/]Islamic abaya[/URL] this new video where the [URL=http://www.onlinemuslimitems.com/]Muslim scarf[/URL] game designers [URL=http://www.onlinemuslimitems.com/]Buy Muslim Abaya[/URL] tell us a little about [URL=http://www.onlinemuslimitems.com/]Cheap Muslim Abaya[/URL] the 2 different [URL=http://www.onlinemuslimitems.com/]Buy Muslim Items[/URL] classes find Sith characters [URL=http://www.onlinemuslimitems.com/]Cheap Muslim Items[/URL] in the game, The [URL=http://www.findnike.com]Islamic hijab[/URL] Inquisitor Sith [URL=http://www.onlinemuslimitems.com]Islamic scarf[/URL] and Sith Warrior. They explain a lot of [URL=http://www.onlinemuslimitems.com]Islamic Items[/URL] pictures as designed [URL=http://www.onlinemuslimitems.com]Muslim wear[/URL] these characters and [URL=http://www.onlinemuslimitems.com]Muslim clothing[/URL] their characteristics [URL=http://www.onlinemuslimitems.com]Muslim wear Pas Cher[/URL] one more devoted [URL=http://www.onlinemuslimitems.com]Muslim wear[/URL] to the use of force [URL=http://www.onlinemuslimitems.com]Muslim clothing[/URL] powers and one more [URL=http://www.onlinemuslimitems.com/]Muslim Items For Sale[/URL] dedicated to close combat.



  2. Alguien sabe como adaptar este codigo a un gestor de contenido como joomla ?



  3. Buena función, os paso algunos cambios que se pueden hacer...
    probad como quedan en mi web...

    // codigo para obtener la marca de agua valign=middle
    //imagecopy($im2, $im, (imagesx($im2)/2)-(imagesx($im)/2), (imagesy($im2)/2)-(imagesy($im)/2), 0, 0, imagesx($im), imagesy($im));

    // codigo para obtener la marca de agua valign=top
    //imagecopy($im2, $im, (imagesx($im2)/2)-(imagesx($im)/2), 1, 0, 0, imagesx($im), imagesy($im));

    // codigo para obtener la marca de agua valign=bottom
    imagecopy($im2, $im, (imagesx($im2)/2)-(imagesx($im)/2), (imagesy($im2)-imagesy($im)), 0, 0, imagesx($im), imagesy($im));


    DENTRO DEL BUCLE, SI QUEREIS REPETIR LA MARCA... este es el código para ponerla abajo del todo

    // codigo para obtener la marca de agua valign=bottom
    imagecopy($im2, $im, ((imagesx($im2)/2)-(imagesx($im)/2))-(imagesx($im)*$n), (imagesy($im2)-imagesy($im)), 0, 0, imagesx($im), imagesy($im));
    imagecopy($im2, $im, ((imagesx($im2)/2)-(imagesx($im)/2))+(imagesx($im)*$n), (imagesy($im2)-imagesy($im)), 0, 0, imagesx($im), imagesy($im));


    Probad estos cambios aqui: http://www.gruposycontactos.com



  4. Para modificar la posicion de la marca de agua lo que hay que hacer es cambiar los valores en la siguiente linea:
    imagecopy($im2, $im, (imagesx($im2)/2)-(imagesx($im)/2), (imagesy($im2)/2)-(imagesy($im)/2), 0, 0, imagesx($im), imagesy($im));

    por ejemplo si se divide por 20 en lugar de 2 la imagen sube para arriba, tambien se puede cambiar los menos por mas, lo que hay que dejar como esta es donde dice 0,0



  5. y para cambiar la posicion de la marca de awa??



  6. muy bueno el script, aunq deberian de haber hecho una explicacion algo mas detallada del script pero en fin.
    Respondo a la pregunta q muchos se hacen, q desean q esta imagen se guarde y no q solo se muestre, en ese caso el imagejpeg($im2); se convertiria en imagejpeg($im2,"nuevafoto.jpg");
    claro q lo guarda pero ahora hay q ver las cabeceras y todo eso, espero haber podido ayudar



  7. amigo yo tengo en mi galeria de fotos de mi web intalado el MG2 de minigal y ya le he hecho varias modificaciones al codigo para adaptarlo a mi site web, ahora bien es posible introducir ese dodigo en el index.php en el admin.php de la galeria de fotos para que al cargar una fotografia ya le aplique automaticamente el codigo? podrias ayudarme con esto? si quieres te envio por email el codigo para que me expliques como lo introduzco, gracias.



  8. me parece muy interesante esto de las marcas d agua por que te la oportunidad de incrustar tu logo para hacer branding y atraer trafico a tu sitio y ademas protegerte de que cuando te chupen la imgen y lo incruste en en otro sitio tu logo y su url estaran publicitadas insitu.. xD..

    me gusta la idea lo voy probar
    y nada asi sera..



  9. Hola, oigan una pregunta!!!

    he hecho todo como esta en el tutorial, el problema es que le baja calidad a la imagen cuando le añade la marca agua, alguien que me pueda decir donde le modifico porque no encuentro donde para ponerle la calidad de la imagen al 100% ????



  10. CORRER PHP EN WINDOWS
    El técnico en Redes que piensa que phpMyAdmin ejecutará PHP en Windows, supongo que tendrá bastantes trabajos por terminar. Me gustaría que me explicara cómo instala phpMyAdmin en Windows SIN UN SERVIDOR DE PHP.

    Para responder... Yo utilizo EasyPHP en Windows para hacer las pruebas locales de PHP sin estar conectado a Internet. Es muy fácil de instalar y de usar. Además, instala MySQL y phpMyAdmin. Descarga el EasyPHP, instálalo y podrás ejecutar código PHP bajo windows. Otra ventaja es que no necesariamente debe estar cargado de forma permanente, sino que lo ejecutas cuando lo vas a usar y listo.


    Antonio Garrido
    Diseño y desarrollo de Software
    Yoled Software
    http://www.yoled.com



  11. Necesitas un servidor web, como apache o IIS, phpMyAdmin es un sistema hecho en PHP para trabajar con MYSQL



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



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



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



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

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



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



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



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



  20. A mi no me tira :D



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



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



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

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

API DE FACEBOOK
GOOGLE CALENDAR API
GOOGLE MAPS API