PHP agrega marca de agua. Agregue una marca de agua dinámica a una imagen usando PHP. Implementando una marca de agua usando PHP

Si desea agregar una marca de agua a una foto sin molestarse con los editores de imágenes o agregarla mientras carga fotos en el servidor, entonces este tutorial es para usted.

En este tutorial, le mostraré cómo agregar una marca de agua a una imagen sobre la marcha sin cambiar la imagen original. En primer lugar, necesitará una imagen para utilizarla como marca de agua.

Luego formamos el encabezado del archivo:

// esta línea le indicará al navegador que estamos pasando un encabezado de imagen jpg("content-type: image/jpeg");

Luego formamos imagen png y obtenga sus dimensiones:

// crea una marca de agua en formato png $watermark = imagecreatefrompng("watermark.png"); // obtiene el ancho y el alto $watermark_width = imagesx($watermark); $watermark_height = imágenesy($watermark);

Haremos lo mismo con la imagen original, pero sólo en formato jpg. Esto es común para las fotos que se cargan a través de un formulario. Procedemos de la siguiente manera:

// creando una imagen jpg $image_path = "original.jpg"; $imagen = imagecreatefromjpeg($image_path); // obtener el tamaño de la imagen $size = getimagesize($image_path);

Ahora necesitamos colocar una marca de agua en la imagen:

// coloca una marca de agua en la parte inferior derecha. Sangría 5px $dest_x = $tamaño - $watermark_width - 5; $dest_y = $tamaño - $watermark_height - 5;

A continuación, configuremos las opciones de fusión para ambas imágenes:

Imagealphablending($imagen, verdadero); imagealphablending($marca de agua, verdadero);

Finalmente creamos una nueva imagen usando los parámetros:

// crea una nueva imagen imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height); imagenjpeg($imagen);

Es importante limpiar lo que ensucia:

// libera memoria imagedestroy($image); imagedestroy($marca de agua);

Puede utilizar Photoshop para ajustar la transparencia de la marca de agua.

Eso es todo con teoría. Ahora apliquemos nuestro conocimiento a un proyecto real. Todo esto debe guardarse en un archivo. Por ejemplo, llamado marca de agua.php

Encabezado("tipo de contenido: imagen/jpeg"); // obtener el nombre de la imagen mediante GET $image = $_GET["image"]; // crea una marca de agua $watermark = imagecreatefrompng("watermark.png"); // obtiene el alto y el ancho de la marca de agua $watermark_width = imagesx($watermark); $watermark_height = imágenesy($watermark); // crea un jpg a partir de la imagen original $image_path = "/path/to/image/folder/" . $imagen; $imagen = imagecreatefromjpeg($image_path); //si algo sale mal if ($image === false) ( return false; ) $size = getimagesize($image_path); // coloca una marca de agua en la imagen $dest_x = $size - $watermark_width - 5; $dest_y = $tamaño - $watermark_height - 5; imagealphablending($imagen, verdadero); imagealphablending($marca de agua, verdadero); // crea una nueva imagen imagecopy($image, $watermark, $dest_x, $dest_y, 0, 0, $watermark_width, $watermark_height); imagenjpeg($imagen); // libera memoria imagedestroy($image); imagedestroy($marca de agua);

Ahora, para mostrar una foto con una marca de agua sin cambiar la imagen original, use el siguiente código.

Los propietarios de sitios web (foros, foros de mensajes, etc.) a menudo se enfrentan al problema de crear marcas de agua en todas las imágenes grandes del sitio.

Por supuesto, este problema se puede resolver creando manualmente una marca de agua en cada imagen; sin embargo, en primer lugar, esto lleva mucho tiempo y, en segundo lugar, es necesario almacenar dos versiones de la imagen, con y sin marca de agua.

Una solución a este problema puede ser aplicar dinámicamente una marca de agua a la imagen antes de transmitirla al visitante del sitio.

Existe una solución a este problema en Internet en forma de dos archivos, cuyo contenido se detalla a continuación.
Código fuente del archivo ".htaccess"

DirectoryIndex index.php RewriteEngine en RewriteCond %(REQUEST_FILENAME) -f RewriteRule ^(.*)$ /watermark/_watermark.php

Código fuente del archivo "_watermark.php"

250) && ($info_o > 250)) ( // Para imágenes sin canal alfa // El último parámetro de la función es el grado de opacidad de la marca de agua imageCopyMerge($out, $watermark, ($info_o-$info_w)/ 2, ($info_o -$info_w)/2, 0, 0, $info_w, $info_w, 25); // Para imágenes con canal alfa // En este caso, la transparencia se ajusta por el canal alfa de la imagen. sí mismo // imageCopy($out, $watermark, ($info_o-$info_w)/2, ($info_o-$info_w)/2, 0, 0, $info_w, $info_w ) cambiar ($info_o) ( caso 1: imageGIF($out); caso 2: imageJPEG($out); imagePNG($out); imageDestroy($original); imageDestroy($marca de agua); devolver verdadero; ) ?>

La solución se reduce a lo siguiente: el archivo “.htaccess” se coloca en el directorio con los archivos de imagen. Además, se crea una carpeta de "marca de agua" en el servidor, en la que hay un archivo de script "_watermark.php" y el archivo de marca de agua real "watermark.png".

Al mismo tiempo, en comparación con la versión original encontrada en Internet, realicé cambios menores en ambos archivos de texto.

En el archivo ".htaccess", se ha añadido la extensión "jpeg" a la expresión regular para buscar archivos de imágenes, como también se encuentra con frecuencia.

El script "_watermark.php" ha sido reelaborado de tal manera que coloca la marca de agua en el centro de la imagen (esto era requerido por las características específicas del problema que se estaba resolviendo) y se ha agregado la capacidad de ajustar la transparencia de la marca de agua creada. (los comentarios en el cuerpo del script le ayudarán a configurar este parámetro usted mismo).

También debes prestar atención al hecho de que colocando la carpeta "marca de agua" en la carpeta con imágenes, como aconsejan las fuentes originales, no lograremos el resultado deseado, porque en este caso tendremos que tener su propio archivo ".htaccess" y carpeta "marca de agua" en cada carpeta. Esto se debe al hecho de que el archivo ".htaccess" especifica rutas absolutas desde el directorio raíz del sitio al archivo "_watermark.php". Por lo tanto, al tener una subcarpeta de “marca de agua” separada en cada carpeta con imágenes, si necesitamos cambiar la marca de agua (o el script que la superpone en la imagen), tendremos que realizar cambios en todas las carpetas.

Para evitar este problema, recomiendo crear una carpeta de "marca de agua" en el directorio raíz del sitio y colocar un archivo ".htaccess" en los directorios de imágenes sin tener que cambiarlo cada vez. En este caso, para cambiar la marca de agua o el script, necesitaremos realizar cambios en un solo lugar del sitio. En este caso, puede crear diferentes marcas de agua para diferentes carpetas con imágenes consultando diferentes archivos".htaccess" a diferentes scripts, por ejemplo "_watermark-1.php", "_watermark-2.php", etc.

Por lo tanto, para resumir, podemos decir que para aplicar marcas de agua a todas las imágenes del sitio, debe descargar el archivo adjunto a continuación, descomprimirlo, colocar la carpeta "marca de agua" en el directorio raíz del sitio y reemplazar el archivo de marca de agua ". watermark.png” con el suyo propio y coloque el archivo ".htaccess" en esos directorios de sitios, cuyas imágenes deben tener una marca de agua.

Descarga el archivo que contiene todo archivos necesarios puedes usar esto

En algunos casos, agregar marcas de agua a las imágenes que publica en su sitio es la única forma de protegerlas de alguna manera contra el robo. Además, dicen que este tipo de marcas de agua atraen tráfico adicional.

Hay muchas maneras de poner una marca de agua en una imagen con usando PHP, pero mi cliente necesitaba un método de aplicación que le permitiera cambiar la marca de agua por una nueva en cualquier momento.

Resulta que existe esa solución.

Esto suele ser utilizado por personas que desarrollan sitios web con contenido principalmente gráfico.

Seleccionar un método de marca de agua

El problema de implementar todo este lío es elegir cómo aplicar la marca de agua entre rendimiento y flexibilidad. Simplemente no existe una solución ideal que se adapte a todos. Por eso hay muchas implementaciones.

En mi caso, el cliente se reserva el derecho de cambiar la marca en cualquier momento y en su lugar "Cuernos y pezuñas" escribir “Pezuñas y cuernos”. El método de marca de agua que elija también debería tolerar esto.

La esencia de la tecnología de marca de agua que se describe aquí es agregar esta misma marca cada vez que se carga una imagen. Sí, este método conlleva una serie de limitaciones que pueden afectar significativamente el rendimiento, pero como dicen, el cliente siempre tiene la razón y, por tanto, si las tiene. la tarea requiere aplicar dinámicamente una marca de agua, entonces esto es exactamente lo que hay que hacer.

Si alguien tiene una manera más fácil, puede comentar. Será interesante escuchar.

Antes de presentar algún código, me gustaría describir las ventajas y dar un ejemplo práctico.

Ventajas:

  • puedes cambiar la marca de agua al menos 500 veces al día;
  • se puede implementar en cualquier CMS (no está vinculado a él de ninguna manera).

Desventajas:

  • depende del rendimiento del hosting (si tienes muchas imágenes o son de alta resolución, esto puede suponer una carga significativa para el servidor);
  • una mente curiosa aún podrá eliminar su marca de agua.

Conclusiones: Para publicar una pequeña cantidad de imágenes con marcas de agua, este método es perfecto, pero si vas a abrir una galería de fotos, sería mejor buscar algo menos cargado.

Ejemplo

Implementando una marca de agua usando PHP

Como te prometimos, no necesitas tener ningún conocimiento especial para esto, necesitas:

  1. archivo, que está en el archivo, y colóquelo en el directorio raíz de su sitio;
  2. Colocamos la imagen que actuará como marca de agua en el directorio raíz del sitio y le asignamos un nombre (en mi caso es un trazo de pincel blanco, por lo que es posible que el enlace no sea visible en el fondo de su navegador). La imagen debe ser un PNG, ya que tiene una capa transparente. Si desea utilizar GIF, debe editar el archivo. imagen.php;
  3. en el lugar donde deseas mostrar la imagen con la marca de agua coloca el código:

Eso es todo. Todos contentos, tanto usted como el cliente.

Una de las cosas interesantes que puedes hacer con la biblioteca de gráficos PHP GD es una clase que pone marcas de agua en una imagen. En pocas palabras, la marca de agua es una tecnología para proteger imágenes digitales del uso no autorizado agregándoles marcas de agua o firmas. Como consecuencia de esto, puede usarse (y generalmente se usa) para determinar el propietario de los derechos de autor de una imagen. Entonces, sigamos adelante.

Introducción

En esta etapa de su desarrollo, PHP ofrece a los programadores una amplia gama de funciones para generar imágenes dinámicamente y trabajar con ellas. En este artículo te mostraré una técnica para crear una clase que pondrá marcas de agua en estas mismas imágenes. Esta clase trabajará con dos imágenes: la original y la marca de agua. Además, se ha introducido un tercer parámetro: nuestra clase contendrá una variable alfa. Esto nos permitirá utilizar un canal alfa para nuestra marca de agua.

Para referencia

canal alfa: parte de la imagen que almacena información sobre la transparencia de áreas individuales de la imagen, mientras que canales de color almacenar información sobre el color de la imagen. EN editores gráficos se utiliza para enmascarar (proteger de la edición) alguna área de la imagen. En algunas aplicaciones se les llama máscara transparente.

La información que se encuentra en el canal alfa suele representar áreas resaltadas: alguna forma o disposición de áreas coloreadas. Almacenar un canal alfa en una imagen aumenta el tamaño del archivo en 1/3. Las imágenes RGB pueden tener hasta 24 canales alfa. Los mapas de bits y las imágenes indexadas no pueden contener canales alfa.

Primera parte: conceptos básicos

Antes de comenzar a escribir la clase en sí, veamos las funciones que se utilizarán en ella. Aquí está su lista:

# devuelve el ancho y alto de la imagen imágenesx() imágenesy() # crea una nueva imagen de color verdadero imagecreatetruecolor # devuelve matriz asociativa con las teclas rojo, verde y azul (+ canal alfa) que contienen los valores correspondientes para el índice de color especificado imagecolorsforindex() # devuelve el índice de color de un píxel en la ubicación especificada en la imagen imagecolorat() # dibuja un solo píxel del color dado imagesetpixel() # devuelve el índice de colores del índice en la paleta de imágenes, el identificador de color (compuesto por los componentes RGB) y el índice del color de la paleta de imágenes que está "más cerca" del valor RGB, respectivamente (estos datos es necesario para la función imagesetpixel()) imagecolorexact() imagecolorallocate() imagecolorclosest()

Como puedes ver, php tiene suficientes funciones para trabajar con gráficos. Aunque en teoría el objetivo de algunos de ellos no está del todo claro, en la práctica todo es mucho más sencillo. Por tanto, para descubrir cómo trabajar con ellos, los aplicaremos en nuestra clase.

Elegir el camino hacia la meta

Ahora que ya hemos decidido el objetivo de nuestro "miniproyecto", retrocedamos un poco y hablemos sobre las formas de implementarlo.

Para empezar, nuestra aplicación recibe dos imágenes: la imagen original y la propia marca de agua. A continuación, debemos determinar las dimensiones de estas imágenes (ancho-ancho y alto-alto). Necesitamos estos datos para colocar la marca de agua en el centro de la imagen (suponiendo que el tamaño de la marca de agua será más pequeño que la imagen misma).

Luego deberás aplicar nuestra marca de agua a la imagen original. Para hacer esto, necesitamos agregar los colores de las imágenes superpuestas (matemáticamente) para obtener una tercera.

Y al final necesitaremos mostrar la imagen resultante en el navegador. En este caso, la imagen se abrirá directamente desde la fuente especificada en la etiqueta " "

Creo que la teoría ya es suficiente: los puntos clave que contiene se revelan con suficiente detalle. Ahora pasemos a escribir el guión.

Segunda parte: escribir un guión

Comencemos con lo más simple: escriba una clase que cree un archivo con una marca de agua. Llamémoslo "marca de agua" y escribamos su código en el archivo "api.watermark.php". El “esqueleto” de la clase tendrá tres funciones:

El siguiente paso es escribir código para las funciones de clase "marca de agua". Complementamos el archivo "api.watermark.php" con las siguientes líneas de código:

# función que fusiona dos imágenes de origen en una función create_watermark($main_img_obj, $watermark_img_obj, $alpha_level = 100) ( # convierte el valor de transparencia del canal alfa de % a decenas $alpha_level/= 100; # calcula las dimensiones de la imagen (ancho y alto) $main_img_obj_w = imágenesx($main_img_obj); $main_img_obj_h = imágenesy($main_img_obj); $watermark_img_obj_w = imágenesx($watermark_img_obj /2)-($watermark_img_obj_); con 2)); main_img_obj_max_x=ceil(($main_img_obj_w/2)+($watermark_img_obj_w/2)); $main_img_obj_max_y=ceil(($main_img_obj_h/2)+($watermark_img_obj_h/2)); ($main_img_obj_w, $main_img_obj_h); imagen con marca de agua devuelve $return_img; ) # fin de la función create_watermark()

Ahora echemos un vistazo más de cerca a la función create_watermark().

En primer lugar, le pasamos tres parámetros:

# la imagen original a la que se le aplicará la marca de agua $main_img_obj # la marca de agua en sí debe contener un canal alfa $watermark_img_obj # el valor de transparencia del canal alfa de la marca de agua, (0-100, predeterminado = 100) $alpha_level

(Es importante tener en cuenta que nuestra función acepta imágenes como objetos, no solo rutas hacia ellas, pero hablaremos de eso más adelante)

El siguiente paso es crear una nueva imagen en color verdadero con las mismas dimensiones que la imagen original. Esta imagen (variable $return_img) se utilizará para combinar información de las imágenes originales (dibujo y marca de agua).

Pero antes de eso, todavía necesitas "repasar" cada una de las dos imágenes iniciales y "fusionarlas" en una. Es demasiado pronto para hacerlo; aún no estamos preparados para ello. En su lugar, publicaremos un comentario de "algo de código" y luego llenaremos ese espacio con una sección de código.

El resultado final es que nuestra imagen modificada se mostrará en la página web que la solicite. A continuación, veamos las dos funciones auxiliares restantes.

Tercera parte: funciones auxiliares

Además de la función create_watermark, nuestra clase de marca de agua contiene dos funciones más. Continuemos fuente clase con las siguientes líneas:

# promediando dos colores teniendo en cuenta la transparencia de la función del canal alfa _get_ave_color($color_a, $color_b, $alpha_level) ( return round((($color_a*(1-$alpha_level))+($color_b*$alpha_level)) ) # devuelve los valores de los componentes RGB más cercanos de la nueva función de imagen _get_image_color($im, $r, $g, $b) ( $c=imagecolorexact($im, $r, $g, $b); ); si ($c!=- 1) devuelve $c; $c=imagecolorallocate($im, $r, $g, $b); si ($c!=-1) devuelve imagecolorclosest($im, $r); , $g, $b);

Y ahora más detalles. Nuestra primera función "_get_ave_color" toma los valores numéricos de dos colores y un canal alfa. Devuelve su valor promedio. Necesitamos esta función para determinar el color que se obtendrá cuando se superpongan los píxeles de dos imágenes.

La segunda función "_get_image_color" divide la imagen en componentes rojo (rojo), verde (verde) y azul (azul) (paleta rgb). Usando las funciones integradas en PHP para trabajar con gráficos (su descripción se encuentra al principio del artículo), obtenemos el valor de color más cercano para la nueva imagen.

Además, también se comprueban varios puntos. En primer lugar, si fue posible obtener el valor exacto (variable $c), entonces se devuelve desde la función (devuelve $c). De lo contrario, se intenta seleccionar un color utilizando la función imagecolorallocate(). Si esto no ayuda a lograr el resultado, entonces usando la función imagecolorclosest() simplemente se devuelve el valor de color más cercano (el más inexacto).

Bueno, nuestra clase está casi lista. Todo lo que queda es reemplazar el comentario "algo de código" en la función "create_watermark" con las siguientes líneas:

# recorrer la imagen para($y = 0; $y< $main_img_obj_h; $y++) { for ($x = 0; $x < $main_img_obj_w; $x++) { $return_color = NULL; # определение истинного расположения пикселя в пределах # нашего водяного знака $watermark_x = $x - $main_img_obj_min_x; $watermark_y = $y - $main_img_obj_min_y; # выбор информации о цвете для наших изображений $main_rgb = imagecolorsforindex($main_img_obj, imagecolorat($main_img_obj, $x, $y)); # если наш пиксель водяного знака непрозрачный if ($watermark_x >= 0 && $marca de agua_x< $watermark_img_obj_w && $watermark_y >= 0 && $marca de agua_y< $watermark_img_obj_h) { $watermark_rbg = imagecolorsforindex($watermark_img_obj, imagecolorat($watermark_img_obj, $watermark_x, $watermark_y)); # использование значения прозрачности альфа-канала $watermark_alpha = round(((127-$watermark_rbg["alpha"])/127),2); $watermark_alpha = $watermark_alpha * $alpha_level; # расчет цвета в месте наложения картинок $avg_red = $this->_get_ave_color($main_rgb["rojo"], $watermark_rbg["rojo"], $watermark_alpha); $avg_green = $this->_get_ave_color($main_rgb["verde"], $watermark_rbg["verde"], $watermark_alpha); $avg_blue = $this->_get_ave_color($main_rgb["blue"], $watermark_rbg["blue"], $watermark_alpha); # usando los datos recibidos, calcula el índice de color $return_color = $this->_get_image_color($return_img, $avg_red, $avg_green, $avg_blue); # si no podemos elegir un color, entonces simplemente toma # una copia del píxel original) else ( $return_color = imagecolorat($main_img_obj, $x, $y); ) # de los píxeles resultantes dibujamos una nueva imagen imagesetpixel ($return_img, $x, $ y, $return_color); ) )

Después de escribir una parte tan importante del código, puede hacer una pausa y observar más de cerca su análisis.

Lo primero que hace nuestro script es recorrer la imagen usando dos bucles "for". Al mismo tiempo, también se calculan las coordenadas de cada píxel de la marca de agua.

A continuación, se busca información RGB para cada píxel. Si el píxel actual no está en el área de intersección de la imagen original y la marca de agua, entonces nuestra clase solo duplica el píxel de la nueva imagen. Si el píxel está ubicado en el área de intersección, debemos determinar su color como resultado de la superposición de la imagen original y la marca de agua.

Para determinar el color del área de intersección, primero necesitamos obtener el valor de la variable RGB de la marca de agua usando la información que obtuvimos en los bucles "for". Luego, utilizando la función "_get_ave_color", se determina el valor de color promedio para la nueva imagen. Luego viene la función "_get_image_color" para determinar el esquema de color que utilizará la función "return_img".

Como resultado, una vez completados los bucles "for", tenemos una imagen terminada con una marca de agua.

Ahora veamos nuestra clase en acción.

Cuarta parte: prueba de manejo

Para comenzar, necesitamos dos archivos. Llamemos al primero "watermark_test.php" y coloquemos el siguiente código en él:



El propósito de este archivo es muy simple: muestra las imágenes originales (main.jpg) y resultantes (watermark.png, con una marca de agua) en el navegador.

Como puede ver, nuestra segunda imagen (watermark.png) se refiere al archivo php image.php y no al archivo de imagen. Este enlace toma la forma de una solicitud GET, donde los valores de dos variables se transfieren al archivo php: $main y $watermark.

Llamemos al segundo archivo "image.php" y coloquemos el siguiente código en él:

create_watermark($main_img_obj, $watermark_img_obj, 66); # mostrar nuestra imagen resultante en el navegador - # pero primero déjele saber que es un encabezado de archivo jpeg("Content-Type: image/jpeg"); encabezado("Disposición de contenido: en línea; nombre de archivo=". $_GET["src"]); imagenjpeg($return_img_obj, "", 50); ?>

Bueno, hemos llegado al final. (ZIP, 47,6Kb)

Conexión