Una aplicación vino del cliente, en el sitio anterior, para actualizar todas las imágenes, es decir, agregar una marca de agua con un logotipo en ellas. El problema era que había más de 10,000 imágenes y estaban en diferentes carpetas y debajo de carpetas.
Decidimos escribir un script universal que se pueda ejecutar desde la consola o directamente en el navegador y actualizar todas las imágenes en el sitio.
Y entonces la tarea:
- Las imágenes están en la carpeta img en la raíz del sitio;
- Agregue una marca de agua al centro de la imagen;
- Transfiera todas las imágenes a la carpeta img2;
En el proceso de resolver el problema, resultó que todas las imágenes también son de diferentes tamaños, desde 200 hasta 7000 píxeles de ancho, y la marca de agua en forma de logotipo debería ser del todo. Cómo resolvimos este problema:
Etapa 1. Omitir todos los archivos
Primero necesita averiguar con qué trabajaremos, y para esto mostramos todos los archivos y carpetas que están en la carpeta img en el sitio.
$path = $_SERVER['DOCUMENT_ROOT'];
Y la función de omitir todos los elementos de la carpeta:
function find_new($dir) { $new_dir = null; $dir_files = opendir($dir); while(false !== ($file = readdir($dir_files))) { if($file != '.' && $file != '..') $new_dir[] = $dir."/".$file; } if($new_dir) foreach($new_dir as $check ) { if(is_file($check)) { echo $check . "<br>"; } elseif(is_dir($check)) find_new($check); } } find_new($root);
Como puede ver en la lista, la función es recursiva, como resultado del trabajo de este script, aparecerán en la pantalla muchas líneas con rutas absolutas a los archivos en el sitio.
Lo único que no se implementa aquí es buscar imágenes, pero no nos fue útil.
Etapa 2. Recrea la estructura de carpetas
Dado que tenemos muchas carpetas, con subcarpetas, etc. hasta el nivel 10, para el funcionamiento exitoso de todas las funciones de copiar y mover archivos, necesitamos una estructura lista para usar.
Para hacer esto, determinamos el nombre de la carpeta, por supuesto, y si no está allí, creamos:
$fileName = basename($check);
Este código se inserta después de: echo $ check; y cuando se ejecuta, genera una nueva estructura de carpetas en su servidor, aunque puede ejecutarla infinitamente muchas veces, no dañará la estructura, sino que creará una carpeta img2 adyacente.
Etapa 3. Agregue un logotipo a las imágenes.
Usaremos cuatro funciones estándar para esto: imagecreatefrompng , imagecreatefromjpeg , imagecopy , imagejpeg y un par de tipos adicionales: imagedestroy , imagesx .
Todo esto es una biblioteca GD para PHP, está conectada para todos de forma predeterminada y por lo tanto:
$stamp = imagecreatefrompng('stamp.png');
Por lo tanto, después de 3-5 minutos de la secuencia de comandos, dependiendo de la cantidad de archivos, obtenemos una copia de todas las imágenes en la carpeta img2, pero el logotipo está en la esquina inferior derecha y todas las imágenes tienen diferentes tamaños. Puedes jugar con números en la imagencopia, pero esto no tendrá ningún efecto. Las imágenes son diferentes, lo que significa que la marca de agua debe ser diferente, así que pasamos a la etapa 4.
4ta etapa. Personalización y alineación de logotipos
Para hacer esto, necesitamos convertir el logo original stamp.png al tamaño de la imagen en la que lo colocaremos, y pegarlo exactamente en el medio.
Proceder:
$stamp = imagecreatefrompng('stamp.png');
Si en el paso 3, en imagecopy, usamos imagesx ($ stamp) como las dimensiones de la imagen insertada, entonces aquí ya usamos las dimensiones del nuevo logo imagesx ($ sim).
El logotipo contiene sangrías de 10 píxeles a la izquierda y a la derecha, y se establece respectivamente con los números 20 y 10 en el código.
Paso 5. Agregue la función de conversión a nuestro bucle:
Dado que el guión iba a estar en la rodilla, naturalmente, se puede simplificar y mejorar, sus sugerencias en los comentarios. Pero aquí hay una versión funcional:
path = $_SERVER['DOCUMENT_ROOT']; $root = $path."/img"; $stamp = imagecreatefrompng('stamp.png'); $sx = imagesx($stamp); $sy = imagesy($stamp); function find_new($dir) { global $stamp; global $sx; global $sy; $new_dir = null; $dir_files = opendir($dir); while(false !== ($file = readdir($dir_files))) { if($file != '.' && $file != '..') $new_dir[] = $dir."/".$file; } if($new_dir) foreach($new_dir as $check ) { if(is_file($check)) { $w='';$h='';$koe='';$sim='';
Es suficiente colocarlo en la carpeta raíz del sitio, configurar la carpeta de origen y de destino con imágenes y ejecutarlas si hay muchas imágenes. Añadir primero:
ignore_user_abort(); set_time_limit(0);
Y corre desde la consola para ver las etapas de trabajo.
Los experimentos con la inserción del logotipo y la selección del grado de transparencia se realizan mejor en la carpeta de destino, para esto, en la línea $ root = $ ruta ". / Agregar / su / ruta / a / carpetas" o poner el script en la carpeta de destino y ejecutar desde allí.
Utilizamos un logotipo estándar de la empresa con un 60% de transparencia.
Conclusión
Cuando la carpeta con los nuevos archivos esté lista, solo tiene que cambiarle el nombre de img2 a img. Como resultado, su sitio tendrá una carpeta con archivos de origen que se pueden archivar o eliminar, y una carpeta con fotos marcadas con un logotipo.
Este script es relevante para usar en proyectos en los que las imágenes de productos o artículos ya se han subido, y no hay posibilidad de instalar un script para agregar una marca de agua, o para nada.
La siguiente tarea es reemplazar los datos exif en todas las imágenes del mismo sitio. Para saber qué es y cómo se implementa, lo diremos en el próximo artículo.