Menambahkan tanda air ke semua gambar situs

Aplikasi datang dari klien, di situs lama, untuk memperbarui semua gambar, yaitu menambahkan tanda air dengan logo di atasnya. Masalahnya adalah bahwa ada lebih dari 10.000 gambar dan mereka berada di folder dan folder yang berbeda.


Kami memutuskan untuk menulis skrip universal yang dapat dijalankan dari konsol atau langsung di peramban dan memperbarui semua gambar di situs.


Dan jadi tugasnya:


  1. Gambar ada di folder img di root situs;
  2. Tambahkan tanda air ke tengah gambar;
  3. Transfer semua gambar ke folder img2;

Dalam proses penyelesaian masalah, ternyata semua gambar memiliki ukuran yang berbeda dari lebar 200 hingga 7000 piksel, dan tanda air dalam bentuk logo harus sama sekali. Bagaimana kami memecahkan masalah ini:


Tahap 1. Lewati semua file


Pertama, Anda perlu mencari tahu apa yang akan kami kerjakan, dan untuk ini kami menampilkan semua file dan folder yang ada di folder img di situs.


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

Dan fungsi untuk mem-bypass semua elemen folder:


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

Seperti yang dapat Anda lihat dari daftar, fungsi ini bersifat rekursif, sebagai hasil dari skrip ini, banyak baris dengan jalur absolut ke file di situs akan muncul di layar.


Satu-satunya hal yang tidak diterapkan di sini adalah memeriksa gambar, tetapi itu tidak berguna bagi kami.


Tahap 2. Buat kembali struktur folder


Karena kita memiliki banyak folder, dengan subfolder, dan seterusnya hingga level 10, untuk operasi yang sukses dari semua fungsi menyalin dan memindahkan file, kita memerlukan struktur yang sudah jadi.


Untuk melakukan ini, kami menentukan nama folder, tentu saja, dan jika tidak ada di sana, kami membuat:


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

Kode ini dimasukkan setelah: echo $ check; dan ketika dijalankan, itu menghasilkan struktur folder baru di server Anda, sementara Anda dapat menjalankannya berkali-kali, itu tidak akan merusak struktur, tetapi membuat folder img2 yang berdekatan.


Tahap 3. Tambahkan logo ke gambar


Untuk melakukan ini, kita akan menggunakan empat fungsi standar: imagecreatefrompng , imagecreate darijpeg , imagecopy , imagejpeg dan beberapa tipe tambahan: imagedestroy , imagesx .


Semua ini adalah pustaka GD untuk PHP, ini terhubung untuk semua orang secara default dan karenanya:


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

Jadi, setelah 3-5 menit skrip, tergantung pada jumlah file, kami mendapatkan salinan semua gambar di folder img2, tetapi logo ada di sudut kanan bawah, dan semua gambar memiliki ukuran yang berbeda. Anda dapat bermain-main dengan angka dalam salinan foto tetapi tidak akan ada efek dari ini. Gambar-gambar berbeda, yang berarti tanda air harus berbeda, jadi kami pergi ke tahap 4.


Tahap 4. Kustomisasi dan penyelarasan logo


Untuk melakukan ini, kita perlu mengkonversi cap logo asli ke ukuran gambar di mana kita akan menempatkannya, dan tempel tepat di tengahnya.
Lanjutkan:


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

Jika pada langkah 3, dalam imagecopy, kami menggunakan imagesx ($ cap) sebagai dimensi dari gambar yang disisipkan, maka di sini kami sudah menggunakan dimensi dari imagesx logo baru ($ sim).


Logo berisi lekukan 10 piksel di sebelah kiri dan kanan, dan masing-masing diatur oleh angka 20 dan 10 dalam kode.


Langkah 5. Tambahkan fungsi konversi ke loop kami:


Karena skrip akan berada di lutut, tentu saja dapat disederhanakan dan ditingkatkan, saran Anda di komentar. Tetapi ini adalah versi yang berfungsi:


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

Cukup dengan meletakkannya di folder root situs, atur folder sumber dan tujuan dengan gambar dan jalankan jika ada banyak gambar. Tambahkan dulu:


 ignore_user_abort(); set_time_limit(0); 

Dan lari dari konsol untuk melihat tahapan pekerjaan.


Eksperimen dengan memasukkan logo dan memilih tingkat transparansi paling baik dilakukan di folder tujuan, untuk ini, di baris $ root = $ path. "/ Tambahkan / Anda / path / ke / folder" atau letakkan skrip di folder tujuan dan jalankan dari sana.


Kami menggunakan logo perusahaan standar dengan transparansi 60%.


Kesimpulan


Ketika folder dengan file baru siap, Anda hanya perlu mengubah nama dari img2 ke img. Akibatnya, situs Anda akan memiliki folder dengan file sumber yang dapat diarsipkan atau dihapus, dan folder dengan foto yang ditandai dengan logo.


Skrip ini relevan untuk digunakan pada proyek-proyek di mana gambar produk atau artikel telah diunggah, dan tidak ada kemungkinan untuk menginstal skrip untuk menambahkan tanda air, atau tidak sama sekali.


Tugas selanjutnya adalah mengganti data exif pada semua gambar dari situs yang sama. Untuk apa itu dan bagaimana penerapannya, kami akan memberi tahu di artikel selanjutnya.

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


All Articles