Vom Kunden auf der alten Site kam eine Anwendung, um alle Bilder zu aktualisieren, nämlich ein Wasserzeichen mit einem Logo hinzuzufügen. Das Problem war, dass es mehr als 10.000 Bilder gab und sie sich in verschiedenen Ordnern und unter Ordnern befanden.
Wir haben beschlossen, ein universelles Skript zu schreiben, das über die Konsole oder direkt im Browser ausgeführt werden kann, und alle Bilder auf der Website zu aktualisieren.
Und so die Aufgabe:
- Die Bilder befinden sich im Ordner img im Stammverzeichnis der Site.
- Fügen Sie der Bildmitte ein Wasserzeichen hinzu.
- Übertragen Sie alle Bilder in den Ordner img2.
Bei der Lösung des Problems stellte sich heraus, dass alle Bilder auch unterschiedliche Größen von 200 bis 7000 Pixel haben und das Wasserzeichen in Form eines Logos überhaupt sein sollte. Wie wir dieses Problem gelöst haben:
Stufe 1. Umgehen Sie alle Dateien
Zuerst müssen Sie herausfinden, mit was wir arbeiten werden, und dazu haben wir alle Dateien und Ordner angezeigt, die sich im img-Ordner auf der Site befinden.
$path = $_SERVER['DOCUMENT_ROOT'];
Und die Funktion, alle Elemente des Ordners zu umgehen:
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);
Wie Sie der Auflistung entnehmen können, ist die Funktion rekursiv. Aufgrund der Arbeit dieses Skripts werden auf dem Bildschirm viele Zeilen mit absoluten Pfaden zu den Dateien auf der Site angezeigt.
Das einzige, was hier nicht implementiert ist, ist die Suche nach Bildern, aber es war für uns nicht nützlich.
Stufe 2. Erstellen Sie die Ordnerstruktur neu
Da wir viele Ordner mit Unterordnern usw. bis Stufe 10 haben, benötigen wir für den erfolgreichen Betrieb aller Funktionen zum Kopieren und Verschieben von Dateien eine vorgefertigte Struktur.
Dazu bestimmen wir natürlich den Namen des Ordners und wenn er nicht vorhanden ist, erstellen wir:
$fileName = basename($check);
Dieser Code wird eingefügt nach: echo $ check; und wenn es ausgeführt wird, generiert es eine neue Ordnerstruktur auf Ihrem Server, während Sie es unendlich oft ausführen können, es wird die Struktur nicht beschädigen, sondern einen benachbarten img2-Ordner erstellen.
Stufe 3. Fügen Sie den Bildern ein Logo hinzu
Wir werden hierfür vier Standardfunktionen verwenden: imagecreatefrompng , imagecreatefromjpeg , imagecopy , imagejpeg und einige zusätzliche Typen: imagedestroy , imagesx .
All dies ist eine GD-Bibliothek für PHP, die standardmäßig für alle verbunden ist und so:
$stamp = imagecreatefrompng('stamp.png');
Nach 3-5 Minuten des Skripts erhalten wir abhängig von der Anzahl der Dateien eine Kopie aller Bilder im Ordner img2, aber das Logo befindet sich in der unteren rechten Ecke und alle Bilder haben unterschiedliche Größen. Sie können in der Bildkopie mit Zahlen herumspielen, dies hat jedoch keine Auswirkungen. Die Bilder sind unterschiedlich, was bedeutet, dass das Wasserzeichen unterschiedlich sein muss, also gehen wir zu Stufe 4.
4. Stufe. Anpassung und Ausrichtung des Logos
Dazu müssen wir das Original-Logo stamp.png in die Größe des Bildes konvertieren, auf dem wir es platzieren möchten, und genau in die Mitte einfügen.
Weiter:
$stamp = imagecreatefrompng('stamp.png');
Wenn wir in Stufe 3 in der Bildkopie imagesx ($ stamp) als Abmessungen des eingefügten Bildes verwendet haben, verwenden wir hier bereits die Abmessungen des neuen Logos imagesx ($ sim).
Das Logo enthält links und rechts Einrückungen von 10 Pixel und wird durch die Zahlen 20 und 10 im Code festgelegt.
Schritt 5. Fügen Sie die Konvertierungsfunktion zu unserer Schleife hinzu:
Da das Skript auf dem Knie sein sollte, kann es natürlich vereinfacht und verbessert werden, Ihre Vorschläge in den Kommentaren. Aber hier ist eine funktionierende Version:
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 reicht aus, es in den Stammordner der Site zu legen, den Quell- und Zielordner mit Bildern festzulegen und auszuführen, wenn viele Bilder vorhanden sind. Zuerst hinzufügen:
ignore_user_abort(); set_time_limit(0);
Und laufen Sie von der Konsole aus, um die Arbeitsschritte zu sehen.
Experimente zum Einfügen des Logos und zum Auswählen des Transparenzgrads werden am besten im Zielordner durchgeführt, dazu in der Zeile $ root = $ path. ”/ Add / your / path / to / folders” oder legen Sie das Skript in den Zielordner und führen Sie es von dort aus.
Wir haben ein Standard-Firmenlogo mit 60% Transparenz verwendet.
Fazit
Wenn der Ordner mit den neuen Dateien fertig ist, müssen Sie ihn nur von img2 in img umbenennen. Infolgedessen verfügt Ihre Site über einen Ordner mit Quelldateien, die archiviert oder gelöscht werden können, und einen Ordner mit Fotos, die mit einem Logo gekennzeichnet sind.
Dieses Skript ist für die Verwendung in Projekten relevant, in denen bereits Bilder von Produkten oder Artikeln hochgeladen wurden, und es gibt keine Möglichkeit, ein Skript zum Hinzufügen eines Wasserzeichens zu installieren, oder überhaupt nicht.
Die nächste Aufgabe besteht darin, exif-Daten auf allen Bildern derselben Site zu ersetzen. Was es ist und wie es implementiert wird, erfahren Sie im nächsten Artikel.