Manipularea imaginilor în PHP utilizând GD

Internetul ar fi destul de plictisitor fără imagini. Cu toate acestea, menținerea și manipularea a sute sau mii de imagini pentru site-ul dvs. web poate fi o durere de cap. Pe măsură ce se modifică designul site-ului dvs., este posibil să fie necesar să modificați toate imaginile - de exemplu, este posibil să fie necesar să vă convertiți toate imaginile în tonuri de gri sau să le redimensionați la 50% din dimensiunea originală. De asemenea, este posibil să doriți să comprimați sau să decupați imagini diferite. Făcând acest lucru manual este consumatoare de timp și predispusă la erori, dar cu puțină cunoștințe de programare poate fi automatizată.

În acest tutorial, veți afla despre biblioteca GD (Graphic Draw) din PHP. Veți vedea cum poate fi utilizată această bibliotecă pentru a manipula imaginile prin redimensionarea, trunchierea, rotirea sau filtrarea acestora.

Ce este GD?

PHP poate face mult mai mult decât să servească HTML vizitatorilor. De exemplu, are capacitatea de a manipula imagini. Nu numai că, dar puteți crea, de asemenea, propriile imagini de la zero și apoi salvați-le sau le puteți servi utilizatorilor.

PHP poate gestiona aproape toate nevoile dvs. de bază de manipulare a imaginii folosind biblioteca GD-short pentru Graphic Draw. 

Înființat

Dacă lucrați pe Windows, puteți include php_gd2.dll fișier ca extensie în php.ini. Dacă utilizați ceva de genul XAMPP, veți găsi php_gd2.dll fișier din director xampp \ php \ ext. De asemenea, puteți verifica dacă GD este instalat pe sistemul dvs. utilizând funcția phpinfo ();. Dacă parcurgeți rezultatul rezultat, veți găsi ceva similar cu următorul.

De asemenea, puteți vizita cerințele și paginile de instalare pentru a afla mai multe despre procesul de instalare.

Crearea imaginilor utilizând PHP GD

Primul pas spre manipularea imaginilor folosind PHP este încărcarea lor în memorie ca resursă de imagine. Acest lucru poate fi obținut prin utilizarea diferitelor funcții pentru diferite formate. Toate aceste funcții au nume foarte asemănătoare, astfel încât acestea sunt ușor de reținut.

Creați o imagine nouă

imagecreatetruecolor () se va dovedi util dacă nu aveți o sursă originală de imagine pe care doriți să o manipulați. Acceptă doi parametri întregi: o lățime și o înălțime. Acesta va returna o resursă de imagine dacă totul a mers așa cum a fost planificat. Resursa de imagine returnată este în esență o imagine neagră cu lățimea și înălțimea specificată.

Încărcați un fișier imagine

Dacă intenționați să manipulați imagini deja stocate undeva, veți beneficia de funcții cum ar fi imagecreatefromjpeg (), imagecreatefrompng (), și imagecreatefromgif (). Acestea vor crea o resursă de imagine cu toate datele din fișierul imagine încărcat. Aceste funcții acceptă un singur parametru care specifică locația imaginii pe care o încărcați fie ca adresă URL, fie ca o cale de fișier.

Creați o imagine dintr-un șir

Biblioteca GD vă permite, de asemenea, să creați imagini dintr-un șir folosind imagecreatefromstring () funcția în PHP. Amintiți-vă că va trebui să utilizați base64_decode () pe șirul dat anterior imagecreatefromstring (). Funcția poate detecta automat dacă tipul de imagine este JPG, PNG, GIF sau alt format acceptat.

Rotiți, scalați, decupați și rotiți o imagine

Unele operațiuni comune pe care ați putea dori să le efectuați pe o resursă de imagine sunt rotația, scalarea, trunchierea și răsturnarea.

Rotație

Puteți roti o imagine pe care ați încărcat-o deja în scenariu folosind imagerotate () funcţie. Acesta va roti imaginea la unghiul furnizat, folosind centrul imaginii ca centru de rotație. Unghiul este furnizat ca valoare float, iar PHP consideră că acesta este valoarea gradului de rotație. 

Uneori, imaginea rotită va avea dimensiuni diferite în comparație cu versiunea originală. Aceasta înseamnă că veți ajunge la o zonă neacoperită după rotație. Al treilea parametru al imagerotate () funcția poate fi utilizată pentru a specifica culoarea de fundal a spațiului gol după rotire.

scalarea

Este foarte ușor să scalați o imagine folosind biblioteca GD. Trebuie doar să treci resursa imaginii, precum și lățimea și înălțimea la imagescale () funcţie. Dacă omiteți înălțimea, GD va scala imaginea la lățimea specificată păstrând în același timp raportul de aspect. 

De asemenea, puteți specifica modul de micșorare a imaginii. Poate fi setat la IMG_NEAREST_NEIGHBOUR, IMG_BILINEAR_FIXED, IMG_BICUBIC, etc. Un lucru important pe care trebuie să-l amintiți este faptul că această funcție returnează o nouă sursă de imagine scalată în locul modificării versiunii originale.

decuparea

Puteți decupa orice resursă de imagine folosind imagecrop () funcția în GD. Primul parametru este resursa de imagine originală, iar al doilea parametru este o matrice asociativă cu cheile X, y, lăţime, și înălţime, specificând poziția și dimensiunile ferestrei de decupare.

Imaginea fluture de mai sus a fost tăiată folosind următorul cod:

$ im_php = imagecreatefromjpeg ("cale / spre / imagine"); $ dimensiune = min (imaginix ($ im_php), imagini ($ im_php)); $ im_php = imagecrop ($ im_php, ['x' => $ dimensiune * 0.4, 'y' => 0, 'lățime' => dimensiune $, 'înălțime' => dimensiune $); $ im_php = imaginicale ($ im_php, 300);

În principiu, stocăm lungimea celei mai mici părți în dimensiune $ variabil. Această variabilă este apoi utilizată pentru a defini limita dreptunghiului nostru de decupare. În cele din urmă, imaginea este redusă astfel încât să aibă o lățime de maxim 300 pixeli și o lungime. Acest lucru ne oferă o imagine pătratică corect dimensionată.

Flipping Images

Imaginile pot fi rotite orizontal, vertical sau în ambele direcții, folosind imageflip () funcţie. Acceptă resursa de imagine pe care doriți să o răsuciți ca primul parametru, iar modul flip ca al doilea parametru. Modul flip poate fi setat la IMG_FLIP_HORIZONTAL, IMG_FLIP_VERTICAL, sau IMG_FLIP_BOTH.

Imaginea din stânga sus din figura de mai sus este originalul. Imaginea din dreapta sus a fost creată utilizând IMG_FLIP_HORIZONTAL, imaginea din stânga de jos a fost creată utilizând IMG_FLIP_VERTICAL, iar imaginea din dreapta jos a fost creată folosind IMG_FLIP_BOTH. (Imaginea cioară este de la Pixabay.)

Aplicarea filtrelor la o imagine

GD are, de asemenea, un foarte util imagefilter () care poate aplica filtre pe diferite resurse de imagine încărcate utilizând funcțiile din imaginile anterioare. Această funcție poate accepta diferiți parametri în funcție de filtrul pe care îl aplicați.

Pentru început, specificați resursa imaginii și numele filtrului pe care doriți să-l aplicați. Puteți seta unul dintre cele 12 tipuri de filtre predefinite menționate în docs. 

  • IMG_FILTER_NEGATE: inversează culorile din imagine
  • IMG_FILTER_GRAYSCALE: elimină culoarea din imagine
  • IMG_FILTER_BRIGHTNESS: face imaginea mai luminoasă sau mai întunecată
  • IMG_FILTER_CONTRAST: crește contrastul imaginii 
  • IMG_FILTER_COLORIZE: vopsează imaginea la o anumită culoare
  • IMG_FILTER_EDGEDETECT: evidențiază marginile imaginii
  • IMG_FILTER_EMBOSS: similar cu detectarea marginilor, dar oferă fiecărei margini un aspect ridicat
  • IMG_FILTER_GAUSSIAN_BLUR: estomparea imaginii folosind metoda Gaussian
  • IMG_FILTER_SELECTIVE_BLUR: estomparea imaginii utilizând metoda selectivă
  • IMG_FILTER_MEAN_REMOVAL: un efect pentru a crea o imagine stilizată
  • IMG_FILTER_SMOOTH: îndepărtează marginile zimțate din imagine
  • IMG_FILTER_PIXELATE: face ca imaginea să arate pixelată 

Unele filtre cum ar fi NEGA, ALB-NEGRU, EDGE_DETECT și GRAVA nu au nevoie de date suplimentare. Alte filtre, cum ar fi LUMINOZITATE, CONTRAST și NETED, poate accepta un parametru suplimentar care specifică cantitatea de luminozitate, contrast sau netedă a imaginii finale. Pixelate parametrul vă permite să specificați doi parametri suplimentari: dimensiunea blocului, precum și modul de pixelizare. În cele din urmă, Colorați filtrul acceptă patru parametri care determină valorile componentelor roșu, verde și albastru, precum și canalul alfa.

Imaginea din stânga sus este originalul. Imaginea din dreapta sus a fost creată utilizând Colorați filtru, partea stângă de jos a fost creată utilizând ALB-NEGRU filtru și imaginea din dreapta jos a fost creată utilizând LUMINOZITATE filtru. (Această imagine fluture a fost găsită la Pixabay.)

Alte funcții utile de manipulare a imaginilor

De asemenea, ar trebui să știți despre alte funcții comune ale GD care apar din când în când.

Obțineți dimensiunile imaginii

Puteți stabili lățimea și înălțimea unei resurse de imagine folosind imagesx () și imagesy () funcții.

O altă funcție a fost apelată getimagesize () poate fi de asemenea folosit pentru a obține lățimea și înălțimea imaginii împreună cu tipul acesteia. Această funcție returnează o matrice cu elemente care specifică lățimea, înălțimea și formatul imaginii. Primele două elemente ale matricei descriu lățimea și înălțimea, iar al treilea element conține o constantă care specifică formatul fișierului: unul din IMAGETYPE_PNG, IMAGETYPE_GIF, etc.

Salvarea unei imagini

Odată ce ați realizat toate modificările dorite într-o imagine, probabil că veți dori fie să o transmiteți în browser, fie să o salvați ca fișier. În ambele cazuri, va trebui să utilizați una dintre funcțiile de ieșire GD cum ar fi imagejpeg (), imagepng (), sau imagegif (). Veți transfera resursa imaginii dvs. la una dintre aceste funcții de ieșire și, dacă doriți să salvați imaginea într-un fișier, veți specifica și un nume de fișier. De asemenea, puteți controla calitatea imaginii de ieșire utilizând un al treilea parametru opțional, în funcție de tipul imaginii.

Redimensionarea tuturor imaginilor într-un director

Să aplicăm cunoștințele pe care le-am câștigat până acum pentru a face ceva practic. În această secțiune, vom redimensiona toate imaginile JPEG dintr-un anumit director pentru a avea o lățime de 640 de pixeli. Înălțimea va fi calculată automat în funcție de dimensiunile imaginii originale.

Vom salva imaginile redimensionate într-un folder nou intitulat redimensionat. Toate imaginile originale au în acest caz aceleași dimensiuni, dar codul va funcționa corect cu imagini care au dimensiuni diferite și rapoarte de aspect.

$ director = 'Natura /'; $ images = glob (directorul $. "*. jpg"); foreach ($ imagini ca $ imagine) $ im_php = imagecreatefromjpeg ($ imagine); $ im_php = imaginile ($ im_php, 640); $ new_height = imagini ($ im_php); $ new_name = str_replace ('- 1920x1080', '-640x'. $ new_height, nume de bază ($ image)); imagejpeg ($ im_php, $ director.'Resized /'.$ new_name); 

În codul de mai sus, începem cu ajutorul glob () pentru a găsi toate imaginile cu un .jpg extensie în directorul intitulat Natură. Fișierele imagine sunt stocate într-o matrice și le cuprindem una câte una.

Deoarece toate imaginile pe care dorim să le redimensionăm sunt JPEG-uri, folosim imagecreatefromjpeg () pentru a le încărca în scenariu. imagescale () funcția este apoi utilizată pentru a redimensiona imaginea la o anumită lățime-640 pixeli în cazul nostru. Nu am specificat o înălțime fixă, astfel încât înălțimea să fie calculată automat.

Fiecare dintre fișierele imagine originale a avut -1920x1080 atașat la numele fișierului pentru a indica dimensiunile acestuia. Folosim str_replace () pe numele original al fișierului și înlocuiți-l -1920X1080 cu noua dimensiune a imaginii.

În cele din urmă, salvăm imaginile redimensionate într-un folder numit redimensionat cu noile nume de fișiere. De asemenea, puteți trece un al treilea parametru la imagejpeg () pentru a seta calitatea fișierului imagine salvat. Dacă al treilea parametru este omis, imaginile sunt salvate cu o calitate standard de 75.

Aplicați filtre de gri și filtre de contrast pentru fiecare imagine dintr-un director

De data aceasta, vom aplica două filtre diferite pe fiecare imagine din directorul nostru și vom salva rezultatul final într-un director diferit fără a face nicio modificare în numele fișierului. Hai să ne aruncăm în cod și voi explica ce înseamnă fiecare funcție mai târziu.

$ director = 'Natura /'; $ images = glob (directorul $. "*. jpg"); foreach ($ imagini ca $ imagine) $ im_php = imagecreatefromjpeg ($ imagine); imagefilter ($ im_php, IMG_FILTER_GRAYSCALE); imagefilter ($ im_php, IMG_FILTER_CONTRAST, -25); $ new_name = nume de bază ($ image); imagejpeg ($ im_php, $ director.'Grayscale /'.$ new_name); 

După cum puteți vedea, încărcăm imaginile din Natură director exact cum am făcut pentru exemplul anterior. Cu toate acestea, vom folosi imagefilter () utilizați acest timp pentru a aplica filtre pe resursa de imagine încărcată. 

Observa asta imagefilter () modifică imaginea originală și se întoarce ADEVĂRAT sau FALS pe baza succesului sau a eșecului operațiunii. Aceasta este diferită de cea imagescale () funcția utilizată în secțiunea anterioară, care a returnat resursa imaginii scalate.

Un alt lucru important de retinut este faptul ca filtrul de contrast accepta valori de la -100 la 100. Valorile negative implica un contrast mai mare, iar valorile pozitive implica un contrast mai mic. Aceasta este opusul ceea ce s-ar putea aștepta unii oameni! O valoare de 0 va lăsa imaginea neschimbată.

Filtrul de luminozitate, pe de altă parte, are limite minime și maxime de -255 și 255. Valoarea negativă în acest caz implică o luminozitate minimă, iar valoarea pozitivă implică luminozitatea maximă.

Obținem numele fișierului din calea fișierului utilizând basename () apoi salvați imaginea utilizând imagejpeg () funcţie.

Gândurile finale

Scopul acestui tutorial a fost să vă familiarizați cu biblioteca GD din PHP și să vă arătați cum să utilizați toate aceste funcții pentru a vă ușura viața. Puteți folosi exemplele de la sfârșitul tutorialului pentru a vă scrie propriile scripturi de manipulare a imaginilor. De exemplu, puteți redimensiona o imagine numai dacă este mai lată decât o limită dată, determinând lățimea acesteia utilizând imagesx () funcţie.

Toate aceste funcții deschid o mulțime de posibilități pentru a ușura manipularea imaginii și pentru a economisi mult timp în final. Dacă aveți întrebări legate de acest tutorial, vă rugăm să anunțați-mă în comentarii.

Cod