I min tidligere opplæring diskuterte vi grunnleggende bildehåndtering ved hjelp av PHP GD-biblioteket. I den opplæringen ga jeg en kort introduksjon til biblioteket og viste deg hvordan du laster bilder fra en fil eller oppretter dem fra bunnen av i PHP. Deretter lærte vi å beskjære, rotere, skala og vende et bilde ved hjelp av GD. Jeg dekket imagefilter ()
funksjon for å bruke forskjellige filtre til bildressurser lastet i skriptet. Jeg nevnte også noen nyttige funksjoner i GD som imagesx ()
og imagesy ()
for å få bredden og høyden til det lastede bildet.
Ved slutten av min siste GD-veiledning lærte du hvordan du bruker biblioteket til å automatisere grunnleggende oppgaver som å endre størrelse på alle bilder i en katalog eller bruke filtre som gråtoner på dem før du lagrer sluttresultatet. Hvis du aldri har brukt PHP GD-biblioteket før, foreslår jeg at du går gjennom den innledende GD-artikkelen før du leser denne.
I denne opplæringen lærer vi om mange flere nyttige funksjoner i GD, og hvordan de kan brukes til å automatisere flere av våre bildebehandlingsoppgaver.
Bortsett fra pikslene ved kantene, er hver piksel i et bilde omgitt av åtte andre piksler. Effekter som uskarphet eller kantdeteksjon beregnes for hver piksel avhengig av pikselverdien og verdiene til de omkringliggende pikslene. Ved kantdeteksjon betyr for eksempel en skarp forandring i farge at vi har nådd kanten av noe objekt i bildet. For eksempel vil en plutselig forandring fra hvitt til brunt i bildet under betegne grensen til koppen og bordet.
En enkel måte å spesifisere denne typen filter er med det som kalles en "convolution matrix". GD leverer imageconvolution ($ image, $ matrise, $ div, $ offset)
fungere for å bruke en 3x3 konvolusjonsmatrise til en bilde ressurs $ bilde
.
De $ matrise
parameteren er en rekke tre arrays, som hver inneholder tre flytverdier-ie.e. det er en 3x3 matrise. Det første elementet i den første arrayen multipliseres med fargeværdien til den øverste venstre piksel. På samme måte multipliseres det andre elementet i den første gruppen med fargeværdien av pikselet direkte på toppen av den sentrale piksel. Den endelige fargen på pikselet oppnås ved å legge til resultatet av alle disse multiplikasjonene og deretter dele det med $ div
for normalisering. Normalisering holder vanligvis den endelige fargeværdien under 255.
Som vi har sett, $ div
parameter brukes som divisor for resultatet av konvolusjon for å normalisere verdien. De $ offset
parameter, derimot, brukes til å angi en offset-verdi for alle farger. Du vil se hvordan det påvirker sluttresultatet i eksemplene nedenfor.
Her er en liste over noen forskjellige konvoluttmatriser som vi har brukt på bildet av en kopp på et bord.
$ box_blur = array ([1, 1, 1], [1, 1, 1], [1, 1, 1]); imageconvolution ($ im_php, $ box_blur, 9, 0);
Bokseskarphet fungerer ved bare å gjennomsnittlig hver piksel med sine naboer. Vi stiller divisorens verdi til 9 fordi summen av alle elementene i de tre arrays er 9.
$ sharpen = array ([0, -1, 0], [-1, 5, -1], [0, -1, 0]); imageconvolution ($ im_php, $ sharpen, 1, 0);
Sharpen fungerer ved å overdrive forskjellene mellom hver piksel og naboene. Dette gjør kantene litt klarere. I tilfelle av skjerp er divisoren fortsatt 1 fordi summen av alle elementene i de tre arrays er 1.
$ emboss = array ([- 2, -1, 0], [-1, 1, 1], [0, 1, 2]); imageconvolution ($ im_php, $ emboss, 1, 0);
Embossmatrisen ligner skjæringsmatrisen, bortsett fra at verdiene er negative til øvre venstre og positiv til nederst til høyre - det er det som skaper preg-effekten. Summen av alle elementene i tilfelle av embosskonfulsjonsmatrisen er 1, så vi trenger ikke å bekymre oss for normalisering eller fargekompensasjon.
$ edge_detect = array ([- 1, -1, -1], [-1, 8, -1], [-1, -1, -1]); imageconvolution ($ im_php, $ edge_detect, 1, 0); imageconvolution ($ im_php, $ edge_detect, 1, 255);
Kantdeteksjon ligner på skjerp, men effekten er enda sterkere. Også den opprinnelige verdien av bildet er gitt ikke mer vekt enn naboene - det betyr at vi bare bryr oss om kantene, ikke de opprinnelige solide fargete områdene.
Med kantdeteksjon er summen av alle arrayelementene 0. Dette betyr at bildet vi får vil mest vil være svart, med mindre det skjer en skarp endring i farge, som vanligvis forekommer ved kantene på objektene. Det meste svarte bildet kan vendes til hvitt ved å sette forskyvningsparameteren til 255.
Følgende bilde viser resultatet av alle disse konvoluttmatriser.
PHP GD har mange funksjoner for å kopiere deler av et bilde og deretter endre størrelse eller slå sammen det. Når du bruker disse funksjonene, er det viktig å huske at PHP anser det øverste venstre hjørnet av en billedressurs som sin opprinnelse. En positiv x verdien vil ta deg til høyre for bildet, og en positiv y verdien vil ta deg lenger ned.
Den enkleste av disse funksjonene er imagecopy ($ dst_im, $ src_im, $ dst_x, $ dst_y, $ src_x, $ src_y, $ src_w, $ src_h)
. Det vil kopiere kildebildet til et destinasjonsbilde. De $ dst_x
og $ dst_y
Parametere bestemmer øverste venstre hjørne, der det kopierte bildet skal limes inn. De $ src_x
, $ src_y
, $ src_w
, og $ src_h
parametere bestemmer den rektangulære delen av kildebildet, som vil bli kopiert til destinasjonen.
Du kan bruke denne funksjonen til å beskjære bilder ved å lage et bilde fra bunnen av ved hjelp av Image ()
og kopiere beskjære rektangel av kilde bildet inn i det. Du kan også bruke den til å legge til vannmerker på bilder, men du må huske at med denne metoden kan størrelsen på vannmerket ikke endres i henhold til størrelsen på bildene våre.
En løsning på dette problemet er å bruke imagecopyresized ($ dst_im, $ src_im, $ dst_x, $ dst_y, $ src_x, $ src_y, $ dst_w, $ dst_h, $ src_w, $ src_h)
funksjon. Den aksepterer alle parametrene til imagecopy ()
og to ytterligere parametere for å bestemme størrelsen på målområdet der kildebildet skal kopieres.
De imagecopyresized ()
Funksjonen er ikke perfekt, da det ikke skaler bildet opp og ned veldig bra. Du kan imidlertid få bedre kvalitetsformatering ved hjelp av imagecopyresampled ()
funksjon, som aksepterer alle de samme parametrene.
Det er to funksjoner knyttet til kopiering av bilder som du finner svært nyttig: imagecopymerge ()
og imagecopymergegray ()
.
Funksjonen imagecopymerge ($ dst_im, $ src_im, $ dst_x, $ dst_y, $ src_x, $ src_y, $ src_w, $ src_h, $ pct)
den er lik imagecopy ()
, hvor ekstra $ pct
parameteren bestemmer gjennomsiktigheten av det kopierte bildet. En verdi på 0 betyr ingen gjennomsiktighet, og en verdi på 100 betyr fullstendig gjennomsiktighet. Dette vil være til stor hjelp når du ikke vil helt skjule innholdet i hovedbildet bak vannmerket ditt.
De imagecopymergegray ()
funksjon, derimot, bruker den siste parameteren for å konvertere kildebildet til gråtoner. Hvis den er satt til 0, vil kildebildet miste all sin farge. Hvis den er satt til 100, vil kildebildet forbli upåvirket.
Følgende eksempel bruker imagecopy ()
funksjon for å skru den høyre halvdelen av et bilde til det negative. Vi har allerede diskutert andre funksjoner som imagefilter ()
og imagescale ()
brukes i denne kodebiten i den forrige opplæringen.
$ im_php = imagecreatefromjpeg ('fish-mosaic.jpg'); $ im_php = imagescale ($ im_php, 800); $ im_php_inv = imagescale ($ im_php, 800); $ im_width = imagesx ($ im_php); $ im_height = imagesy ($ im_php); bildefilter ($ im_php_inv, IMG_FILTER_NEGATE); imagecopy ($ im_php, $ im_php_inv, $ im_width / 2, 0, $ im_width / 2, 0, $ im_width / 2, $ im_height); $ new_name = 'fish-mosaic-half-negate.jpg'; imagejpeg ($ im_php, $ new_name);
Her lager vi to kopier av det opprinnelige bildet, som hver har blitt nedskalert til 800 piksler bredt. Etter det bruker vi imagefilter ()
funksjon for å opprette en negativ av $ img_php_inv
bilde ressurs. Den høyre halvdelen av dette negative bildet kopieres deretter til det opprinnelige bildet ved hjelp av imagecopy ()
funksjon.
Dette var en veldig grunnleggende bruk av imagecopy ()
funksjon. Du kan se resultatene under. Du kan også dele bildet i mindre seksjoner eller striper for å skape mer interessante bildeeffekter. Vi vil bruke imagecopymergegray ()
Funger i kodestykket under for å lage flere striper i det opprinnelige fiskbildet.
$ im_php = imagecreatefromjpeg ('fish-mosaic.jpg'); $ im_php = imagescale ($ im_php, 800); $ im_php_bw = imagescale ($ im_php, 800); $ im_width = imagesx ($ im_php); $ im_height = imagesy ($ im_php); $ stripes = 200; for ($ i = 0; $ i < $stripes; $i++) if($i%2 == 0) imagecopymergegray($im_php, $im_php_bw, $i*$im_width/$stripes, 0, $i*$im_width/$stripes, 0, $im_width/$stripes, $im_height, 0); else imagecopymergegray($im_php, $im_php_bw, $i*$im_width/$stripes, 0, $i*$im_width/$stripes, 0, $im_width/$stripes, $im_height, 100); imagefilter($im_php, IMG_FILTER_CONTRAST, -255); imagefilter($im_php, IMG_FILTER_COLORIZE, 250, 0, 0, 100); $new_name = 'fish-mosaic-stripes.jpg'; imagejpeg($im_php, $new_name);
Ovennevnte kodeeksempel bruker en lignende strategi til det forrige eksempelet, men denne gangen har vi delt bildet i mindre striper, som er vendt til gråtoner eller holdt uendret basert på verdien av variabelen $ i
. Etter å ha fullført alle kopieringsfusjonsoperasjonene, bruker vi to filtre på bildet for å få stripene til å skille seg ut.
Følgende bilde viser sluttresultatet av disse to funksjonene sammen med forskjellige bildefiltre.
Noen organisasjoner legger til vannmerkene i bildene for å gjøre det klart at de eier bildet. Det hjelper også med anerkjennelse av merkevarer og fraråder andre mennesker fra å kopiere bildene blatant. Takket være PHP GD er vannmerket bilder en enkel oppgave.
$ im_php = imagecreatefromjpeg ('waterfall.jpg'); $ vannmerke = imagecreatefrompng ('watermark.png'); $ im_width = imagesx ($ im_php); $ im_height = imagesy ($ im_php); $ vannmerke = imagescale ($ vannmerke, $ im_width / 5); $ wt_width = imagesx ($ vannmerke); $ wt_height = imagesy ($ vannmerke); imagecopy ($ im_php, $ vannmerke, 0,95 * $ im_width - $ wt_width, 0,95 * $ im_height - $ wt_height, 0, 0, $ wt_width, $ wt_height); $ new_name = 'waterfall-watermark.jpg'; imagejpeg ($ im_php, $ new_name);
I det ovennevnte kodestykket har vi opprettet to forskjellige bilderessurser ved hjelp av imagecreatefromjpeg ()
for hovedbildet og imagecreatefrompng ()
for vannmerket henholdsvis. Vi bestemmer bredden og høyden på hovedbildet ved hjelp av imagesx ()
og imagesy ()
funksjoner.
Ikke alle bildene du vil vannmerke, har de samme dimensjonene. Hvis du ikke endrer størrelsen på vannmerket basert på dimensjonene til hovedbildet, kan det se rart ut. For eksempel kan et 200px vannmerke se bra ut på et bilde på 1000px, men det vil bli for stort til et 600px stort bilde, og det kan se for lite ut på et 2400px stort bilde.
Derfor bruker vi imagescale ()
funksjon for alltid å holde vannmerket på en femtedel av den opprinnelige bildbredden. Vi bruker deretter imagecopy ()
funksjon for å plassere vannmerket på riktig sted. Her er det endelige resultatet av koden ovenfor.
Foruten vannmerker, kan du også legge til annen informasjon som stedet der et fotografi ble tatt eller det tidspunktet et fotografi ble tatt.
Etter å ha dekket det grunnleggende om bildehåndtering i vår tidligere opplæring, lærte vi om noen andre nyttige funksjoner i GD-biblioteket. Den første delen av opplæringen diskuterte hvordan vi kan manipulere bilder i PHP ved hjelp av konvoluttmatrisen. Jeg viste også noen eksempler på konvolusjonmatriseoperasjonen for å hjelpe deg å forstå hvordan PHP kommer til fargeværdiene til forskjellige piksler.
Den andre delen av opplæringen forklarte hvordan du kopierer og / eller endrer størrelsen på en del av bildet for å lime det inn et annet sted. Dette er praktisk når vi vil legge til noe på et bilde som et vannmerke eller en tidsstempel.
Prøv å bruke alle disse funksjonene for å skape interessante bildeffekter!