Manipulera bilder i PHP med GD

Internet skulle vara ganska tråkigt utan bilder. Att behålla och manipulera hundratals eller tusentals bilder till din webbplats kan dock vara huvudvärk. När din webbplatsdesign ändras kanske du behöver ändra alla dina bilder, till exempel kan du behöva konvertera alla dina bilder till gråskala eller ändra storlek på dem till 50% av deras ursprungliga storlek. Du kanske också vill komprimera eller beskära olika bilder. Att göra detta manuellt är tidskrävande och felaktigt, men med lite programmeringskunskap kan den automatiseras.

I denna handledning kommer du att lära dig om GD (Graphic Draw) -biblioteket i PHP. Du kan se hur det här biblioteket kan användas för att manipulera bilder genom att ändra storlek, beskära, rotera eller filtrera dem.

Vad är GD?

PHP kan göra mycket mer än att bara tjäna HTML för besökare. Det har till exempel förmågan att manipulera bilder. Inte bara det, men du kan också skapa egna bilder från början och sedan antingen spara dem eller tjäna dem till användare.

PHP kan hantera nästan alla dina grundläggande bildhanterande behov genom att använda GD-biblioteket - kort för Graphic Draw. 

Inrätta

Om du arbetar på Windows kan du inkludera php_gd2.dll filen som en förlängning i php.ini. Om du använder något som XAMPP hittar du php_gd2.dll filen i katalogen XAMPP \ php \ ext. Du kan också kontrollera om GD är installerat på ditt system med funktionen phpinfo ();. Om du bläddrar genom den resulterande utgåvan hittar du något som liknar följande.

Du kan också besöka kraven och installationssidorna för att lära dig mer om installationsprocessen.

Skapa bilder med PHP GD

Det första steget mot manipulering av bilder med hjälp av PHP laddar dem i minnet som en bildresurs. Detta kan uppnås genom att använda olika funktioner för olika format. Alla dessa funktioner har mycket liknande namn så att de är lätta att komma ihåg.

Skapa en ny bild

De imagecreatetruecolor () funktionen kommer att vara till hjälp om du inte har en original bildkälla som du vill manipulera. Den accepterar två heltalsparametrar: en bredd och en höjd. Det kommer att returnera en bildresurs om allt gick som planerat. Den returnerade bildresursen är i princip en svart bild med angiven bredd och höjd.

Ladda en bildfil

Om du planerar att manipulera bilder som redan finns lagrade någonstans, kommer du att dra nytta av att använda funktioner som imagecreatefromjpeg (), imagecreatefrompng (), och imagecreatefromgif (). Dessa skapar en bildresurs med alla data från den laddade bildfilen. Dessa funktioner accepterar en enda parameter som anger platsen för den bild du laddar antingen som en URL eller som en filväg.

Skapa en bild från en sträng

GD-biblioteket låter dig också skapa bilder från en sträng med hjälp av imagecreatefromstring () funktion i PHP. Kom ihåg att du måste använda base64_decode () på den givna strängen innan imagecreatefromstring (). Funktionen kan automatiskt identifiera om bildtypen är JPG, PNG, GIF eller ett annat format som stöds.

Rotera, skala, beskära och vända en bild

Vissa vanliga operationer som du kanske vill utföra på en bildresurs är rotation, skalning, beskärning och bläddring.

Rotation

Du kan rotera en bild som du redan har laddat i skriptet med hjälp av imagerotate () fungera. Den roterar bilden med den vinklade vinkeln med hjälp av mitten av bilden som rotationscentrum. Vinkeln tillhandahålls som ett float-värde, och PHP anser att det är graden för rotation. 

Ibland har den roterade bilden olika dimensioner i jämförelse med originalversionen. Det innebär att du kommer att hamna med ett avtäckt område efter rotationen. Den tredje parametern för imagerotate () funktionen kan användas för att ange bakgrundsfärgen på det tomma området efter rotation.

skalning

Det är mycket enkelt att skala en bild med GD-biblioteket. Du måste bara skicka bildresursen samt bredden och höjden till imagescale () fungera. Om du släpper ut höjden kommer GD att skala bilden till den angivna bredden samtidigt som bildförhållandet bevaras. 

Du kan också ange läget för att skala bilden. Det kan ställas in på IMG_NEAREST_NEIGHBOUR, IMG_BILINEAR_FIXED, IMG_BICUBIC, etc. En viktig sak som du behöver komma ihåg är att denna funktion returnerar en ny skalad bildkälla i stället för att ändra den ursprungliga.

beskärning

Du kan beskära vilken bildresurs som helst med hjälp av imagecrop () funktion i GD. Den första parametern är den ursprungliga bildresursen, och den andra parametern är en associativ grupp med tangenterna x, y, bredd, och höjd, specificerar positionen och dimensionerna för beskärningsfönstret.

Fjärilsbilden ovan beskärdes med följande kod:

$ im_php = imagecreatefromjpeg ('path / to / image'); $ size = min (imagesx ($ im_php), imagesy ($ im_php)); $ im_php = imagecrop ($ im_php, ['x' => $ storlek * 0,4, 'y' => 0, 'bredd' => $ size, 'height' => $ size)); $ im_php = imagescale ($ im_php, 300);

I grund och botten lagrar vi längden på den minsta sidan i $ storlek variabel. Denna variabel används då för att definiera gränsen för vår beskärningsrektangel. Slutligen skalas bilden så att den bara är 300 pixlar bred och lång. Detta ger oss en rätt storlek kvadratisk bild.

Flipping Images

Bilder kan vändas horisontellt, vertikalt eller i båda riktningarna med hjälp av imageflip () fungera. Den accepterar bildresursen som du vill vända som första parameter och flip-läge som andra parameter. Flip-läget kan ställas in på IMG_FLIP_HORIZONTAL, IMG_FLIP_VERTICAL, eller IMG_FLIP_BOTH.

Den övre vänstra bilden i ovanstående figur är originalet. Den högra högerbilden skapades med hjälp av IMG_FLIP_HORIZONTAL, Den nedre vänstra bilden skapades med IMG_FLIP_VERTICAL, och den nedre högra bilden skapades med IMG_FLIP_BOTH. (Krångbilden är från Pixabay.)

Tillämpa filter på en bild

GD har också en mycket användbar Imagefilter () funktion som kan applicera filter på olika bildresurser laddade med funktionerna från tidigare bilder. Denna funktion kan acceptera olika parametrar beroende på vilket filter du tillämpar.

Till att börja med anger du bildresursen och namnet på det filter du vill använda. Du kan ställa in den till en av de 12 fördefinierade filtertyperna som nämns i dokumenten. 

  • IMG_FILTER_NEGATE: reverserar färgerna i bilden
  • IMG_FILTER_GRAYSCALE: tar bort färg från bilden
  • IMG_FILTER_BRIGHTNESS: gör bilden ljusare eller mörkare
  • IMG_FILTER_CONTRAST: ökar bildkontrasten 
  • IMG_FILTER_COLORIZE: tonar bilden till en vald färg
  • IMG_FILTER_EDGEDETECT: markerar bildens kanter
  • IMG_FILTER_EMBOSS: liknar kantdetektering, men ger varje kant en upphöjd utseende
  • IMG_FILTER_GAUSSIAN_BLUR: blurs bilden med Gaussian-metoden
  • IMG_FILTER_SELECTIVE_BLUR: blurs bilden med hjälp av den selektiva metoden
  • IMG_FILTER_MEAN_REMOVAL: En effekt för att skapa en stiliserad bild
  • IMG_FILTER_SMOOTH: släpper ut skarpa kanter i bilden
  • IMG_FILTER_PIXELATE: Gör bilden så pixelerad 

Några filter gillar FÖRNEKA, GRÅSKALE, KANTDETEKTOR och UTFÖRA I RELIEF behöver inga ytterligare data. Andra filter, som BRIGHTNESS, KONTRAST och SLÄT, kan acceptera en ytterligare parameter som anger mängden ljusstyrka, kontrast eller jämnhet i den slutliga bilden. De Pixelate Parametern låter dig ange ytterligare två parametrar: blockstorleken och pixelbildningen. Slutligen, den Färglägg filtret accepterar fyra parametrar som bestämmer värdena för de röda, gröna och blåa komponenterna samt alfakanalen.

Bilden längst upp till vänster är originalet. Den högra högerbilden skapades med hjälp av Färglägg filter, den nedre vänstra skapades med hjälp av GRÅSKALE filtrera, och bilden längst ner till höger skapades med hjälp av BRIGHTNESS filtrera. (Denna fjärilsbild hittades på Pixabay.)

Andra användbara bildhanteringsfunktioner

Du bör också veta om några andra vanliga GD-funktioner som kommer till nytta då och då.

Få bildmått

Du kan bestämma bredden och höjden på en bildresurs med hjälp av imagesx () och imagesy () funktioner.

En annan funktion kallas getimagesize () kan också användas för att få bredden och höjden på en bild tillsammans med dess typ. Den här funktionen returnerar en array med element som anger bildens bredd, höjd och format. De första två elementen i arrayen beskriver bredden och höjden, och det tredje elementet innehåller en konstant specificering av filformatet: en av IMAGETYPE_PNG, IMAGETYPE_GIF, etc.

Spara en bild

När du har gjort alla önskade ändringar i en bild, kommer du sannolikt att antingen skriva ut den till webbläsaren eller spara den som en fil. I båda fallen måste du använda en av GD-utgångsfunktionerna som imagejpeg (), imagepng (), eller imagegif (). Du skickar din bildresurs till en av dessa utmatningsfunktioner, och om du vill spara bilden till en fil anger du också ett filnamn. Du kan också styra kvaliteten på utmatningsbilden med en tredje valfri parameter beroende på bildtyp.

Ändra storlek på alla bilder i ett katalog

Låt oss tillämpa den kunskap vi har fått hittills för att göra något praktiskt. I det här avsnittet kommer vi att ändra storlek på alla JPEG-bilder i en viss katalog för att ha en bredd på 640 pixlar. Höjden beräknas automatiskt baserat på originalbildens dimensioner.

Vi kommer att spara de ändrade bilderna i en ny rubrik med titeln resized. Alla originalbilder i det här fallet har samma dimensioner, men koden fungerar korrekt med bilder som har olika storlekar och bildförhållanden.

$ 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, basnamn ($ image)); imagejpeg ($ im_php, $ directory.'Resized /'.$ new_name); 

I ovanstående kod börjar vi med att använda glob () funktion för att hitta alla bilder med a .jpg förlängning i katalogen med titeln Natur. Bildfilerna lagras i en array, och vi slungar över dem en efter en.

Eftersom alla bilder som vi vill ändra storlek på är JPEG, använder vi imagecreatefromjpeg () funktionen för att ladda dem i skriptet. De imagescale () funktionen används sedan för att ändra storlek på bilden till en specifik bredd på 640 pixlar i vårt fall. Vi har inte angett en fast höjd, så höjden kommer att beräknas automatiskt.

Var och en av de ursprungliga bildfilerna hade -1920x1080 bifogas filnamnet för att ange dess mått. Vi använder str_replace () på det ursprungliga filnamnet och ersätt -1920X1080 med den nya bildstorleken.

Slutligen sparar vi de ändrade bilderna i en mapp som heter resized med de nya filnamnen. Du kan också skicka en tredje parameter till imagejpeg () funktionen för att ställa in kvaliteten på den sparade bildfilen. Om den tredje parametern utelämnas sparas bilderna med en standardkvalitet på 75.

Applicera gråskala och kontrastfiltre på varje bild i en katalog

Den här gången kommer vi att tillämpa två olika filter på varje bild i vår katalog och spara det slutliga resultatet i en annan katalog utan att göra några ändringar i filnamnet. Låt oss dyka in i koden, och jag kommer att förklara vad varje funktion gör senare.

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

Som du kan se laddar vi bilderna från Natur katalog precis som vi gjorde för föregående exempel. Vi använder dock Imagefilter () funktionen denna gång för att applicera filter på den laddade bildresursen. 

Lägg märke till att Imagefilter () ändrar originalbilden och returnerar SANN eller FALSK baserat på operationens framgång eller misslyckande. Detta skiljer sig från imagescale () funktion som vi använde i föregående avsnitt, som returnerade den skalade bildresursen.

En annan viktig sak att tänka på är att kontrastfiltret accepterar värden från -100 till 100. Negativa värden innebär mer kontrast och positiva värden innebär mindre kontrast. Detta är motsatsen till vad vissa människor kan förvänta sig! Ett värde på 0 lämnar bilden oförändrad.

Lysstyrningsfiltret har å andra sidan minimi- och maxgränser på -255 och 255. Det negativa värdet i detta fall innebär minimal ljusstyrka och det positiva värdet innebär maximal ljusstyrka.

Vi hämtar filnamnet från filvägen med basnamn () funktionen och spara sedan bilden med hjälp av imagejpeg () fungera.

Slutgiltiga tankar

Syftet med denna handledning var att göra dig bekant med GD-biblioteket i PHP och för att visa dig hur du använder alla dessa funktioner för att göra ditt liv enklare. Du kan använda exemplen i slutet av handledningen som en guide för att skriva dina egna bildhanteringsskript. Du kan till exempel bara ändra storlek på en bild om den är större än en viss gräns genom att bestämma dess bredd med imagesx () fungera.

Alla dessa funktioner ger många möjligheter att göra bildmanipulation enklare och sparar mycket tid i slutändan. Om du har några frågor relaterade till denna handledning, var god och låt mig veta i kommentarerna.