Manipulere bilder i PHP ved hjelp av GD

Internett ville være ganske kjedelig uten bilder. Imidlertid kan vedlikehold og manipulering av hundrevis eller tusenvis av bilder for ditt nettsted være hodepine. Siden nettstedet ditt endres, må du kanskje endre alle bildene dine. For eksempel må du kanskje konvertere alle bildene til gråtoner eller endre størrelsen på dem til 50% av originalstørrelsen. Du vil kanskje også komprimere eller beskjære forskjellige bilder. Å gjøre dette manuelt er tidkrevende og feilaktig, men med litt programmeringskunnskap kan den automatiseres.

I denne opplæringen lærer du om GD (Graphic Draw) biblioteket i PHP. Du får se hvordan dette biblioteket kan brukes til å manipulere bilder ved å endre størrelse, beskjære, rotere eller filtrere dem.

Hva er GD?

PHP kan gjøre mye mer enn bare å tjene HTML til besøkende. For eksempel har den muligheten til å manipulere bilder. Ikke bare det, men du kan også lage dine egne bilder fra bunnen av, og deretter enten lagre dem eller tjene dem til brukere.

PHP kan håndtere nesten alle dine grunnleggende bildebehandlingsbehov ved å bruke GD-biblioteket - kort for Graphic Draw. 

Setup

Hvis du jobber med Windows, kan du inkludere php_gd2.dll filen som en utvidelse i php.ini. Hvis du bruker noe som XAMPP, finner du php_gd2.dll fil i katalogen xampp \ php \ ext. Du kan også sjekke om GD er installert på systemet ved hjelp av funksjonen phpinfo ();. Hvis du ruller gjennom den resulterende produksjonen, finner du noe som ligner på følgende.

Du kan også besøke kravene og installasjonssider for å lære mer om installasjonsprosessen.

Opprette bilder ved hjelp av PHP GD

Det første skrittet mot manipulering av bilder ved hjelp av PHP, er å laste dem inn i minnet som en bilderessurs. Dette kan oppnås ved å bruke forskjellige funksjoner for forskjellige formater. Alle disse funksjonene har svært likt navn slik at de er lette å huske.

Opprett et nytt bilde

De Image () funksjonen vil være nyttig hvis du ikke har en original bildekilde som du vil manipulere. Den aksepterer to heltallsparametre: en bredde og høyde. Det vil returnere en bilde ressurs hvis alt gikk som planlagt. Den returnerte bildressursen er i utgangspunktet et svart bilde med spesifisert bredde og høyde.

Legg inn en bildefil

Hvis du planlegger å manipulere bilder som allerede er lagret et sted, vil du dra nytte av å bruke funksjoner som imagecreatefromjpeg (), imagecreatefrompng (), og imagecreatefromgif (). Disse vil opprette en bilde ressurs med alle dataene fra den lastede bildefilen. Disse funksjonene godtar en enkelt parameter som spesifiserer plasseringen av bildet du laster inn enten som en URL eller som en filbane.

Lag et bilde fra en streng

GD-biblioteket lar deg også lage bilder fra en streng ved hjelp av imagecreatefromstring () funksjon i PHP. Husk at du må bruke base64_decode () på den oppgitte strengen før imagecreatefromstring (). Funksjonen kan automatisk oppdage om bildetypen er JPG, PNG, GIF eller et annet støttet format.

Rotere, skalere, beskjære og vende et bilde

Noen vanlige operasjoner som du kanskje vil utføre på en bildressurs, er rotasjon, skalering, beskjæring og flipping.

rotasjon

Du kan rotere et bilde som du allerede har lastet inn i skriptet ved hjelp av imagerotate () funksjon. Det vil rotere bildet i den angitte vinkelen ved hjelp av midten av bildet som rotasjonssenter. Vinkelen er gitt som en flyteverdi, og PHP anser det å være graden for rotasjon. 

Noen ganger vil det roterte bildet ha forskjellige dimensjoner i forhold til den opprinnelige versjonen. Dette betyr at du vil ende opp med et avdekket område etter rotasjonen. Den tredje parameteren til imagerotate () funksjonen kan brukes til å angi bakgrunnsfargen til det tomme området etter rotasjon.

skalering

Det er veldig enkelt å skalere et bilde ved hjelp av GD-biblioteket. Du må bare passere bildressursen, samt bredden og høyden til imagescale () funksjon. Hvis du utelater høyden, vil GD skalere bildet til den angitte bredden mens du beholder bildeforholdet. 

Du kan også angi modusen for å skalere bildet. Det kan settes til IMG_NEAREST_NEIGHBOUR, IMG_BILINEAR_FIXED, IMG_BICUBIC, etc. En viktig ting du må huske er at denne funksjonen returnerer en ny skalert bildekilde i stedet for å endre den opprinnelige.

beskjæring

Du kan beskjære hvilken som helst bilde ressurs ved hjelp av imagecrop () fungere i GD. Den første parameteren er den opprinnelige bildressursen, og den andre parameteren er en assosiativ array med tastene x, y, bredde, og høyde, Angi posisjon og dimensjoner for beskjæringsvinduet.

Butterflybildet ovenfor ble beskåret ved å bruke følgende kode:

$ im_php = imagecreatefromjpeg ('bane / til / bilde'); $ size = min (imagesx ($ im_php), imagesy ($ im_php)); $ im_php = imagecrop ($ im_php, ['x' => $ størrelse * 0,4, 'y' => 0, 'bredde' => $ størrelse, 'høyde' => $ størrelse]); $ im_php = imagescale ($ im_php, 300);

I utgangspunktet lagrer vi lengden på den minste siden i $ størrelse variabel. Denne variabelen brukes da til å definere grensen til vårt beskjæringsrektangel. Til slutt blir bildet nedskilt slik at det kun er 300 piksler bredt og langt. Dette gir oss et riktig størrelse firkantet bilde.

Vende bilder

Bilder kan vendes horisontalt, vertikalt eller i begge retninger ved hjelp av imageflip () funksjon. Den aksepterer bildet ressursen du vil vende som den første parameteren og flip-modus som den andre parameteren. Flip-modusen kan settes til IMG_FLIP_HORIZONTAL, IMG_FLIP_VERTICAL, eller IMG_FLIP_BOTH.

Det øverste venstre bildet i figuren ovenfor er originalen. Det øverste høyre bildet ble opprettet ved hjelp av IMG_FLIP_HORIZONTAL, nederst venstre bilde ble opprettet ved hjelp av IMG_FLIP_VERTICAL, og nederst høyre bilde ble opprettet ved hjelp av IMG_FLIP_BOTH. (Kråka bildet er fra Pixabay.)

Bruke filtre til et bilde

GD har også en veldig nyttig imagefilter () funksjon som kan bruke filtre på forskjellige bilderessurser lastet ved hjelp av funksjonene fra tidligere bilder. Denne funksjonen kan akseptere ulike parametere avhengig av filteret du søker på.

Til å begynne med, angi bilderessursen og navnet på filteret du vil bruke. Du kan sette den til en av de 12 forhåndsdefinerte filtertyper som er nevnt i dokumentene. 

  • IMG_FILTER_NEGATE: reverserer fargene i bildet
  • IMG_FILTER_GRAYSCALE: fjerner farge fra bildet
  • IMG_FILTER_BRIGHTNESS: gjør bildet lysere eller mørkere
  • IMG_FILTER_CONTRAST: Øker bildekontrast 
  • IMG_FILTER_COLORIZE: toner bildet til en valgt farge
  • IMG_FILTER_EDGEDETECT: fremhever kantene på bildet
  • IMG_FILTER_EMBOSS: Ligner kantdeteksjon, men gir hver kant en hevet utseende
  • IMG_FILTER_GAUSSIAN_BLUR: Blurser bildet ved hjelp av Gauss-metoden
  • IMG_FILTER_SELECTIVE_BLUR: Blurser bildet ved hjelp av den selektive metoden
  • IMG_FILTER_MEAN_REMOVAL: En effekt for å lage et stilisert bilde
  • IMG_FILTER_SMOOTH: glattar kantede kanter i bildet
  • IMG_FILTER_PIXELATE: gjør bildet ser pixelert ut 

Noen filtre som negere, GRÅSKALA, EDGE_DETECT og Relieff trenger ikke ytterligere data. Andre filtre, som LYS, KONTRAST og GLATT, kan akseptere en ekstra parameter som angir mengden lysstyrke, kontrast eller glatthet av det endelige bildet. De Pixelate parameteren lar deg spesifisere to tilleggsparametere: blokkstørrelsen samt modusen for pixelering. Endelig, den Farge filteret godtar fire parametere som bestemmer verdiene for de røde, grønne og blå komponentene, samt alfakanalen.

Bildet øverst til venstre er originalen. Det øverste høyre bildet ble opprettet ved hjelp av Farge filter, nederst til venstre ble opprettet ved hjelp av GRÅSKALA filter, og bildet nederst til høyre ble opprettet ved hjelp av LYS filter. (Dette bildet ble funnet på Pixabay.)

Andre nyttige bildehåndteringsfunksjoner

Du bør også vite om noen andre vanlige GD-funksjoner som kommer til nytte hver nå og da.

Få bilde dimensjoner

Du kan bestemme bredden og høyden til en bilde ressurs ved hjelp av imagesx () og imagesy () funksjoner.

En annen funksjon kalles getimagesize () kan også brukes til å få bredde og høyde på et bilde sammen med sin type. Denne funksjonen returnerer en matrise med elementer som angir bredden, høyden og formatet på bildet. De to første elementene i arrayet beskriver bredden og høyden, og det tredje elementet inneholder en konstant spesifisering av filformatet: en av IMAGETYPE_PNG, IMAGETYPE_GIF, etc.

Lagre et bilde

Når du har gjort alle ønskede endringer i et bilde, vil du mest sannsynlig enten sende den til nettleseren eller lagre den som en fil. I begge tilfeller må du bruke en av GD-utgangsfunksjonene som imagejpeg (), imagepng (), eller imagegif (). Du vil overføre bilderessursen til en av disse utgangsfunksjonene, og hvis du vil lagre bildet i en fil, spesifiserer du også et filnavn. Du kan også kontrollere kvaliteten på utdatabildet ved hjelp av en tredje valgfri parameter, avhengig av bildetypen.

Endre størrelse på alle bilder i et katalog

La oss bruke kunnskapen vi har fått så langt til å gjøre noe praktisk. I denne delen vil vi endre størrelsen på alle JPEG-bildene i en bestemt katalog for å ha en bredde på 640 piksler. Høyden beregnes automatisk basert på dimensjonene til det opprinnelige bildet.

Vi lagrer de endrede bildene i en ny mappe med tittelen Endret størrelsen. Alle de opprinnelige bildene i dette tilfellet har samme dimensjoner, men koden vil fungere skikkelig med bilder som har forskjellige størrelser og størrelsesforhold.

$ directory = 'Nature /'; $ images = glob ($ directory. "*. jpg"); foreach ($ bilder som $ image) $ im_php = imagecreatefromjpeg ($ image); $ im_php = imagescale ($ im_php, 640); $ new_height = imagesy ($ im_php); $ new_name = str_replace ('- 1920x1080', '-640x'. $ new_height, basename ($ image)); imagejpeg ($ im_php, $ directory.'Resized /'.$ new_name); 

I ovennevnte kode begynner vi å bruke glob () funksjon for å finne alle bildene med a .jpg utvidelse i katalogen med tittelen Natur. Bildefilene lagres i en matrise, og vi slår over dem en etter en.

Siden alle bildene vi ønsker å endre størrelse på, er JPEG, bruker vi imagecreatefromjpeg () funksjon for å laste dem inn i skriptet. De imagescale () funksjonen brukes da til å endre størrelsen på bildet til en bestemt bredde på 640 piksler i vårt tilfelle. Vi har ikke angitt en fast høyde, så høyden beregnes automatisk.

Hver av de opprinnelige bildefilene hadde -1920x1080 lagt til filnavnet for å indikere dens dimensjoner. Vi bruker str_replace () på det opprinnelige filnavnet og erstatt -1920X1080 med den nye bildestørrelsen.

Til slutt lagrer vi de endrede bildene i en navngitt mappe Endret størrelsen med de nye filnavnene. Du kan også sende en tredje parameter til imagejpeg () funksjon for å angi kvaliteten på den lagrede bildefilen. Hvis den tredje parameteren utelates, lagres bildene med en standardkvalitet på 75.

Bruk gråtoner og kontrastfiltre på hvert bilde i et katalog

Denne gangen vil vi bruke to forskjellige filtre på hvert bilde i katalogen vår og lagre sluttresultatet i en annen katalog uten å gjøre endringer i filnavnet. La oss dykke inn i koden, og jeg vil forklare hva hver funksjon gjør senere.

$ directory = 'Nature /'; $ images = glob ($ directory. "*. jpg"); foreach ($ bilder som $ image) $ im_php = imagecreatefromjpeg ($ image); bildefilter ($ im_php, IMG_FILTER_GRAYSCALE); imagefilter ($ im_php, IMG_FILTER_CONTRAST, -25); $ new_name = basenavn ($ image); imagejpeg ($ im_php, $ directory.'Grayscale /'.$ new_name); 

Som du kan se, laster vi bildene fra Natur katalog nøyaktig som vi gjorde for det forrige eksempelet. Vi bruker imidlertid imagefilter () Funger denne gangen for å bruke filtre på den lastede bildressursen. 

Legg merke til det imagefilter () endrer det opprinnelige bildet og returnerer EKTE eller FALSK basert på suksess eller feil i operasjonen. Dette er forskjellig fra imagescale () funksjonen vi brukte i forrige seksjon, som returnerte den skalerte bildressursen.

En annen viktig ting å huske på er at kontrastfilteret aksepterer verdier fra -100 til 100. Negative verdier innebærer mer kontrast, og positive verdier innebærer mindre kontrast. Dette er motsatt av hva noen kan forvente! En verdi på 0 vil la bildet være uendret.

Lysstyrkefilteret har derimot minimum og maksimumsgrenser på -255 og 255. Den negative verdien i dette tilfellet innebærer minimum lysstyrke, og den positive verdien tilsier maksimal lysstyrke.

Vi får filnavnet fra filbanen ved hjelp av basename () funksjonen og lagre bildet ved hjelp av imagejpeg () funksjon.

Siste tanker

Målet med denne opplæringen var å gjøre deg kjent med GD-biblioteket i PHP og å vise deg hvordan du bruker alle disse funksjonene for å gjøre livet enklere. Du kan bruke eksemplene på slutten av opplæringen som en veiledning for å skrive dine egne bildemanipuleringsskript. For eksempel kan du bare endre størrelsen på et bilde hvis det er bredere enn en gitt grense ved å bestemme bredden ved hjelp av imagesx () funksjon.

Alle disse funksjonene åpner opp mange muligheter for å gjøre bildet manipulasjon enklere og spare deg mye tid til slutt. Hvis du har noen spørsmål knyttet til denne opplæringen, vennligst gi beskjed i kommentarene.