ImageMagick är en bildbehandlare, eller egentligen en samling av program som anropas med kommandon genom t.ex. en kommandotolk för att utföra önskade uppgifter. ImageMagick är väldigt kompetent och kan t.ex. läsa över 200 olika bildformat och manipulera bilder på ett sätt som annars inte är möjligt i PHP med t.ex. GD.
Denna artikel har för avsikt att ge dig en inblick i hur du använder ImageMagick från PHP, vad du bör tänka på och var du kan lära dig mer om att utnyttja ImageMagick till dess fulla potential.
Eftersom ImageMagick egentligen inte har någon direkt anknytning till PHP utan endast är ett sätt för program att genom ett kommando utföra bildredigering, så är det inte säkert att alla webbhotell har stöd för det.
En webbapplikation utvecklad i PHP som använder ImageMagick för bildbehandling kan alltså sluta fungera om webbplatsen flyttas till ett annat webbhotell som saknar stödet. För enklare bildbehandling är det därför bättre att förlita sig på biblioteket GD i PHP som nästan alla webbhotell har stöd för.
Med tanke på detta inlägg har jag även skapat en lista med svenska webbhotell som har stöd för ImageMagick så det blir lättare för dig som verkligen är i behov av det att hitta ett.
Varför ImageMagick och inte GD?
Det enkla svaret är att ImageMagick är ett mycket mer komplett verktyg att använda sig av och är kapabel till att utföra så mycket mer än GD.
Se dessa exempel på vad ImageMagick kan göra.
Hur du kan använda ImageMagick i PHP
ImageMagick måste givetvis vara installerat på servern och sedan finns det två möjligheter att använda ImageMagick på. Båda har sina fördelar, men tyvärr är det inte säkert att du kan välja metod själv. Om den ena metoden fungerar på ett webbhotell så är det inte säkert att den andra metoden gör det.
Den första metoden är att direkt anropa ImageMagick genom att exekvera ett kommando från PHP. Problemet med denna metoden är egentligen ganska många.
- Du måste ha tillgång till att exekvera kommandon i PHP genom funktioner som system() eller exec().
- Det blir också väldigt svårtolkad kod och kommentering i PHP-filen blir extra viktig.
- Ett sista problem är att kommandon skiljer sig mellan operativsystem, vilket gör att ett kommando som fungerar på Linux inte nödvändigtvis fungerar på Windows.
En fördel skulle vara att det endast blir väldigt lite kod för att utföra något och det finns massor av färdiga exempel för bildredigering genom kommandon.
Den andra metoden är att använda sig av Imagick som är tillägg till PHP som i sin tur använder ImageMagick API. Denna metod kräver också att ImageMagick är installerat på servern, men också att tillägget Imagick är aktiverat i PHP. Denna metod gör att webbhotellen slipper tillåta att kommandon exekveras direkt från PHP-filer. Det blir också mycket snyggare kod och lättare att hantera om eventuella fel skulle uppstå.
Anropa ImageMagick genom exec() för att skapa en tumnagel
Det är inte speciellt svårt att komma igång om du tänkt exekvera kommandon direkt från PHP. Det är dock en trög inlärningskurva att få grepp på kommandon och parametrar. Följande exempel skapar en tumnagel med en maximal bredd på 200 pixlar.
$image = $_SERVER['DOCUMENT_ROOT'].'/stor_bild.jpg'; $ouput = $_SERVER['DOCUMENT_ROOT'].'/liten_bild.jpg'; // Skapa en tumnagel ($ouput) av $image med en maximal bredd på 200 pixlar exec("convert $image -thumbnail 200 -quality 75 $ouput");
I exemplet ovan bestämmer 200 storleken på tumnageln som skapas. Det som skickas med är geometri-data och hade du skrivit 200×200 hade tumnageln inte blivit större än de måtten men ändå behållit sitt bildformat (aspect ratio). Hade du lagt till operatorn ^ efteråt så du fått 200×200^ och då hade bilden minskat så att varken bredden eller höjden blev mindre än de måtten. Du hittar all information om detta här.
Denna guide är inte inriktat på att förklara allt du kan göra med ImageMagick, men jag ska ändå ge ytterligare ett exempel som bygger på ovanstående kommando. Om du hade lagt till operatorn ! efter dimensionerna så hade bilden minskat till exakt de måtten, men den hade ignorerat bildformatet och bilden hade känts utdragen.
Om du exempelvis vill skapa avatarer som är exakt 64×64 pixlar så är det bästa sättet att först försöka förminska de så mycket som möjligt med operatorn ^ för att sedan beskära bilden och på så sätt ta bort den överflödiga delen av bilden. Följande kommando gör exakt det:
convert stor_bild.jpg -thumbnail 64x64^ -gravity center -crop 64x64+0+0 -format jpg -quality 75 liten_bild.jpg
Den första delen av kommandot är exakt som ovan fast med operatorn ^, på så sätt blir aldrig bilden mindre än 64×64 pixlar. Fokus sätts sedan på mitten av bilden med -gravity center och därefter klipps 64×64 pixlar ut. Jag har även lagt till parametern -format som framtvingar att formatet som sparas är JPEG.
Allt detta går att göra med GD i PHP och i de flesta fall rekommenderas det att du använder det då GD förmodligen är snabbare och du slipper som sagt problemet om du byter webbhotell. De exempel som ges här har alltså för avsikt att endast demonstrera hur du använder ImageMagick från PHP.
Anropa ImageMagick genom Imagick till PHP för att göra detsamma
Den andra metoden är att använda Imagick till PHP och det finns en del färdiga exempel på hur du kan använda tillägget för PHP vilket gör det relativt enkelt att komma igång. Detta är den metod som är att föredra och absolut lättast att utföra.
För att åstadkomma detsamma som i vårt första exempel med förra metoden så behöver du göra enligt följande:
$image = $_SERVER['DOCUMENT_ROOT'].'/stor_bild.jpg'; $output = $_SERVER['DOCUMENT_ROOT'].'/liten_bild.jpg'; // Skapa nytt objekt och läs in bild $image = new Imagick($image); // Skapa en Tumnagel med 200 pixlar i bredd $image->thumbnailImage(200, 0); // Spara bilden $image->writeImage($output); // Förstör objektet och frisätt resurser $image->destroy();
Om du skulle vilja göra en avatar likt exemplet ovan där bilden förminskas och sen klipps bort för att skapa 64×64 pixlar så är det lite lättare då du endast kan använda en fördefinierad funktion för detta istället.
$image->cropThumbnailImage(64, 64);
Ovanstående gör alltså det samma som i föregående men ändrar aldrig bildförhållandet och klipper bort allting som skulle ligga utanför.
Tips för dig som tänk använda ImageMagick i PHP
Om du utvecklar ett system som fler än du kommer använda men där ImageMagick skulle kunna tillföra värdefulla funktioner så kan du kontrollera om klassen finns och aktivera funktionerna efter det. Du kan enkelt göra det med funktionen class_exist() i PHP som i exemplet nedan:
if(class_exists('Imagick')) echo 'Klassen finns'; else echo 'Klassen finns tyvärr inte, använd GD istället!';
Installera och lägga till Imagick i PHP
Jag rekommenderar att du följer anvisningarna för att installera PECL tillägg för Linux.
För Windows är det inte lika enkelt. Jag ville lägga in stödet på på min utvecklingsserver som kör XAMP och det tog ett tag innan jag hittade en dll-fil att ladda ner.
Jag hittade till sist en bloggare vid namn Mikko som kompilerat det för PHP 5.3 och 5.4 som du kan hämta från hans blogg. Med andra ord behöver du bara:
- Ladda ner de kompilerade dll-filerna från hans blogg.
- Välj en trådsäker eller icke-trådsäker version och lägg i katalogen ext i installationskatalogen för PHP.
- Aktivera tillägget genom att lägga till extension=php_imagick_ts.dll i filen (förslagsvis på en egen rad tillsammans med de andra tilläggen så du lätt hittar raden).
- Starta om Apache (inte helt säker på att det behövs).
- Om du kör phpinfo(); ska du se information om tillägget.