Ajout d'un filigrane Ă  toutes les photos du site

Une application est venue du client, sur l'ancien site, pour mettre à jour toutes les images, à savoir ajouter un filigrane avec un logo dessus. Le problÚme était qu'il y avait plus de 10 000 photos et qu'elles se trouvaient dans différents dossiers et sous dossiers.


Nous avons dĂ©cidĂ© d'Ă©crire un script universel qui peut ĂȘtre exĂ©cutĂ© depuis la console ou directement dans le navigateur et mettre Ă  jour toutes les images sur le site.


Et donc la tĂąche:


  1. Les images sont dans le dossier img Ă  la racine du site;
  2. Ajoutez un filigrane au centre de l'image;
  3. Transférez toutes les images dans le dossier img2;

Dans le processus de rĂ©solution du problĂšme, il s'est avĂ©rĂ© que toutes les images sont Ă©galement de tailles diffĂ©rentes de 200 Ă  7000 pixels de large, et le filigrane sous la forme d'un logo devrait ĂȘtre du tout. Comment nous avons rĂ©solu ce problĂšme:


Étape 1. Contourner tous les fichiers


Vous devez d'abord savoir avec quoi nous allons travailler, et pour cela, nous avons affiché tous les fichiers et dossiers qui se trouvent dans le dossier img sur le site.


$path = $_SERVER['DOCUMENT_ROOT']; //  $root = $path."/img"; //  

Et la fonction pour contourner tous les éléments du dossier:


 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); 

Comme vous pouvez le voir dans la liste, la fonction est récursive, à la suite du travail de ce script, de nombreuses lignes avec des chemins absolus vers les fichiers du site apparaßtront à l'écran.


La seule chose qui n'est pas implémentée ici est la recherche d'images, mais cela ne nous a pas été utile.


Étape 2. RecrĂ©ez la structure des dossiers


Étant donnĂ© que nous avons de nombreux dossiers, avec des sous-dossiers, et ainsi de suite jusqu'au niveau 10, pour le bon fonctionnement de toutes les fonctions de copie et de dĂ©placement de fichiers, nous avons besoin d'une structure prĂȘte Ă  l'emploi.


Pour ce faire, nous déterminons bien sûr le nom du dossier et s'il n'est pas là, nous créons:


 $fileName = basename($check); //   $new = str_replace("img","img2",$check); //   $put = substr($new,0,-strlen($fileName)); //    if (!file_exists($put)) { mkdir($put, 0777, true); //  ,   } 

Ce code est inséré aprÚs: echo $ check; et une fois exécuté, il génÚre une nouvelle structure de dossiers sur votre serveur, alors que vous pouvez l'exécuter infiniment de fois, il n'endommagera pas la structure, mais créera un dossier img2 adjacent.


Étape 3. Ajoutez un logo aux images


Pour ce faire, nous utiliserons quatre fonctions standard: imagecreatefrompng , imagecreatefromjpeg , imagecopy , imagejpeg et quelques types supplémentaires: imagedestroy , imagesx .


Tout ceci est une bibliothÚque GD pour PHP, elle est connectée pour tout le monde par défaut et donc:


 $stamp = imagecreatefrompng('stamp.png'); //,   $sx = imagesx($stamp); //  $sy = imagesy($stamp); // $im = imagecreatefromjpeg($check); //  imagecopy($im, $stamp, imagesx($im) - $sx - 10, imagesy($im) - $sy - 10, 0, 0, imagesx($stamp), imagesy($stamp)); //    imagejpeg($im, $new, 100); //  imagedestroy($im); //   

Ainsi, aprĂšs 3-5 minutes du script, selon le nombre de fichiers, nous obtenons une copie de toutes les images dans le dossier img2, mais le logo est dans le coin infĂ©rieur droit, et toutes les images ont des tailles diffĂ©rentes. Vous pouvez jouer avec les nombres en copie d'image, mais cela n'aura aucun effet. Les images sont diffĂ©rentes, ce qui signifie que le filigrane doit ĂȘtre diffĂ©rent, nous allons donc Ă  l'Ă©tape 4.


4Úme étape. Personnalisation et alignement du logo


Pour ce faire, nous devons convertir le logo original stamp.png Ă  la taille de l'image sur laquelle nous le placerons, et coller exactement au milieu.
Continuez:


 $stamp = imagecreatefrompng('stamp.png'); //,    2000*1500 $sx = imagesx($stamp); //  $sy = imagesy($stamp); // $im = imagecreatefromjpeg($check); //  ///    $w = imagesx($im) - 20; //    $koe=$sx/$w; //   $h=ceil($sy/$koe); //   //echo $sx."-".$sy." ".$w."-".$h." ".$koe."<BR>"; //   $sim = imagecreatetruecolor($w, $h); //     $transparent = imagecolorallocatealpha($sim, 0, 0, 0, 127); //    imagefill($sim, 0, 0, $transparent); //    imagesavealpha($sim, true); //    imagecopyresampled($sim,$stamp,0,0,0,0,$w,$h,$sx,$sy); //    $sim $cn = ceil((imagesy($im) - $h)/2); //     imagecopy($im, $sim, imagesx($im) - $w - 10, $cn, 0, 0, imagesx($sim), imagesy($sim)); //    

Si à l'étape 3, en imagecopy, nous avons utilisé imagesx ($ stamp) comme dimensions de l'image insérée, alors ici nous utilisons déjà les dimensions du nouveau logo imagesx ($ sim).


Le logo contient des retraits de 10 pixels à gauche et à droite, et est défini respectivement par les chiffres 20 et 10 dans le code.


Étape 5. Ajoutez la fonction de conversion à notre boucle:


Étant donnĂ© que le script allait ĂȘtre Ă  genoux, il peut naturellement ĂȘtre simplifiĂ© et amĂ©liorĂ©, vos suggestions dans les commentaires. Mais voici une version de travail:


 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=''; //echo $check . "<br>"; $im = imagecreatefromjpeg($check); ///    $w = imagesx($im) - 20; //    $koe=$sx/$w; $h=ceil($sy/$koe); //  //echo $sx."-".$sy." ".$w."-".$h." ".$koe."<BR>"; $sim = imagecreatetruecolor($w, $h); $transparent = imagecolorallocatealpha($sim, 0, 0, 0, 127); //    imagefill($sim, 0, 0, $transparent); //    imagesavealpha($sim, true); //    imagecopyresampled($sim,$stamp,0,0,0,0,$w,$h,$sx,$sy); $cn = ceil((imagesy($im) - $h)/2); //     //    imagecopy($im, $sim, imagesx($im) - $w - 10, $cn, 0, 0, imagesx($sim), imagesy($sim)); $fileName = basename($check); $put = substr($check,0,-strlen($fileName)); $put = str_replace("img","cache",$put); if (!file_exists($put)) { mkdir($put, 0777, true); } $new = str_replace("img","cache",$check); imagejpeg($im, $new, 100); imagedestroy($im); } elseif(is_dir($check)) find_new($check); } } find_new($root); 

Il suffit de le placer dans le dossier racine du site, de définir le dossier source et de destination avec des images et de l'exécuter s'il y a beaucoup d'images. Ajouter d'abord:


 ignore_user_abort(); set_time_limit(0); 

Et exécutez à partir de la console pour voir les étapes du travail.


Les expériences d'insertion du logo et de sélection du degré de transparence sont mieux effectuées dans le dossier de destination, pour cela, dans la ligne $ root = $ path.


Nous avons utilisé un logo d'entreprise standard avec 60% de transparence.


Conclusion


Lorsque le dossier contenant les nouveaux fichiers est prĂȘt, il vous suffit de le renommer img2 en img. En consĂ©quence, votre site aura un dossier avec des fichiers source qui peuvent ĂȘtre archivĂ©s ou supprimĂ©s, et un dossier avec des photos marquĂ©es d'un logo.


Ce script est pertinent à utiliser sur des projets dans lesquels des images de produits ou d'articles ont déjà été téléchargés, et il n'y a aucune possibilité d'installer un script pour ajouter un filigrane, ou pas du tout.


La tĂąche suivante consiste Ă  remplacer les donnĂ©es exif sur toutes les images du mĂȘme site. Pour ce qu'il est et comment il est mis en Ɠuvre, nous le dirons dans le prochain article.

Source: https://habr.com/ru/post/fr424693/


All Articles