Hem » Handbok » Imagick – PHP

Imagick – PHP

ImageMagick är ett kommandoradsverktyg och bibliotek som ger möjlighet att manipulera och transformera rasterbilder och andra typ av media. Det kan användas för att konvertera bilder mellan olika format, skala, rotera, beskära, bädda in text och bortom detta. Det kan även användas för att skapa animerade GIF:ar och skapa nya bilder genom att kombinera flera olika bilder och effekter.

PHP-biblioteket för ImageMagick, som heter Imagick, ger möjlighet att använda alla dessa funktioner från PHP-skript. Det kan användas för att automatiskt manipulera bilder på en webbsida, t.ex. att skala om en bild till en viss storlek eller att lägga till en vattenstämpel. Det kan även användas för att skapa dynamiska grafiska element, t.ex. för att generera visuella representationer av data.

Exempel – Beskär en bild med Imagick

<?php

// Ladda bilden
$image = new Imagick('image.jpg');

// Sätt beskärningsområdet
$image->cropImage(100, 100, 10, 10);

// Spara den beskurna bilden
$image->writeImage('cropped_image.jpg');

?>

I det här exemplet laddas bilden ”image.jpg” och den beskärs till en storlek på 100×100 pixlar med startpunkten (10, 10). Den beskurna bilden sparas sedan som ”cropped_image.jpg”.

Observera att du behöver ha ImageMagick och Imagick-biblioteket installerade på din server för att det här exemplet ska fungera. De flesta webbhotell med PHP har detta biblioteket aktiverat.

Exempel – Skala en bild med Imagick

<?php

// Ladda bilden
$image = new Imagick('image.jpg');

// Sätt maximal bredd och höjd
$maxWidth = 200;
$maxHeight = 100;

// Skala bilden till maximal värden och behåll bildförhållandet
$image->scaleImage($maxWidth, $maxHeight, true);

// Spara den skalade bilden
$image->writeImage('scaled_image.jpg');

?>

I det här exemplet laddas bilden ”image.jpg” och den skalas sedan om till en maximal bredd på 200 pixlar och maximal höjd på 100 pixlar. Bildförhållandet bevaras genom att det minsta förhållandet väljs för att skala om bilden.

Genom att vi skickar med värdet true som tredje parameter i scaleImage så bevaras bildförhållandet (aspect ratio). Vi slipper således manuellt räkna ut vilken bredd eller höjd som skulle varit gränsvärde i skalningen.

Funktionen resizeImage är ofta ett bättre val för att ändra storlek och skala bilder. Där kan du välja mellan olika typer av filter för att bestämma vilken teknik som ska användas vilket även påverkar beräkningskraften en hel del.

Exempel – Skapa en animerad GIF med Imagick

<?php

// Skapa ett tomt animerat GIF
$animation = new Imagick();
$animation->setFormat('gif');

// Ladda bilderna som ska ingå i animeringen
$image1 = new Imagick('image1.jpg');
$image2 = new Imagick('image2.jpg');

// Lägg till bilderna i animeringen och sätt deras visningsintervall
$animation->addImage($image1);
$animation->setImageDelay(100);
$animation->addImage($image2);
$animation->setImageDelay(100);

// Spara animeringen
$animation->writeImages('animation.gif', true);

?>

I det här exemplet laddas bilderna ”image1.jpg” och ”image2.jpg” och de läggs sedan till i en ny animering. Varje bild i animeringen sätts att visas i 100 millisekunder. Den färdiga animeringen sparas som ”animation.gif”.

Den andra parametern i writeImages definierar att varje bild ska inkluderas som en samling (animering) och inte sparas som enskilda bilder vilket blir ett krav för att få en animerad GIF.

Skulle du vilja konvertera en video direkt till gif med hjälp av Imagick kan du bara läsa in en videokälla istället för enskilda bilder. Se exemplet nedan.

<?php

// Skapa ett tomt animerat GIF
$animation = new Imagick();
$animation->setFormat('gif');

// Ladda videon
$video = new Imagick('video.mov');

// Extrahera bilderna från videon och lägg till dem i animeringen
foreach ($video as $frame) {
    $animation->addImage($frame);
}

// Sätt visningsintervallet
$animation->setImageDelay(20);

// Spara animeringen
$animation->writeImages('animation.gif', true);

?>

Varje bild i videon blir här konverterad som en del av sekvensen i en animerad GIF.

När du konverterar en video till animerad GIF kan det vara fördelaktigt att räkna hur många bilder som finns i videon och hur många du vill slutligen ha i din animerade GIF. En video spelas ofta upp i 24/30 bilder per sekund och det är oftast för mycket för en animerad gif om storleken ska vara rimlig.

Här kan du behöva hoppa över bilder så att din animerade GIF inte använder samma antal fps då komprimeringen även är sämre i GIF-filer. Det kan t.ex. vara fördelaktigt att börja med 5 fps för att se om din animerade GIF ser bra ut med det.

För att få en animerad GIF att endast innehålla viss antal bildrutor per sekund kan du använda ”setImageDelay” och ”setIteratorIndex” från Imagick.

Här är ett exempel på hur man kan använda dessa metoder för att skapa en animerad GIF från en videokälla med en lägre bildfrekvens:

<?php

// Skapa ett tomt animerat GIF
$animation = new Imagick();
$animation->setFormat('gif');

// Ladda videon
$video = new Imagick('video.mov');

// Sätt bildfrekvensen till 5 fps
$fps = 5;
$frameInterval = 1000 / $fps;

// Extrahera bilderna från videon och lägg till dem i animeringen
$currentFrame = 0;
$totalFrames = $video->getNumberImages();
while ($currentFrame < $totalFrames) {
    $video->setIteratorIndex($currentFrame);
    $frame = $video->current();
    $animation->addImage($frame);
    $animation->setImageDelay($frameInterval);
    $currentFrame += round(30 / $fps);
}

// Spara animeringen
$animation->writeImages('animation.gif', true);

?>

I det här exemplet laddas videon ”video.mov” och bildfrekvensen sätts till 5 bildrutor per sekund. Varje bild i animeringen sätts att visas i 200 millisekunder (1000 millisekunder / 5 bildrutor = 200 millisekunder). Bildrutorna extraheras från videon och läggs till i animeringen genom att använda metoderna ”setIteratorIndex” och ”current”.

Det går utöka funktionaliteten ytterligare och det är detta som gör ImageMagick så kraftfullt. Du kan t.ex. ändra storlek på varje bild, lägga till grafiska effekter som vinjettering eller andra funktioner.

Kan kräva kraftfullt webbhotell

ImageMagick kan kräva ett kraftfull webbhotell som erbjuder dig att använda ordentligt med resurser både i beräkningskapacitet men också mängden minnesallokering som tillåts av PHP.

Här nedanför kan du se webbhotell som tillåter dig att använda 1024 MB minne i PHP på vissa av deras webbhotellskonton, vilket underlättar hantering av videofiler eller större bilder.

Miss Hosting logo
fr. 1 kr/månfr. 99 kr/mån
Utrymme: 100 GB - ObegränsatTrafik: ObegränsatDomäner: 1 st - ObegränsatMySQL: 1 st - ObegränsatMSSQL: 0 st E-postkonton: ObegränsatKontrollpanel: cPanelPHP Memory Limit: 512 - 2048 MB
PHPASP.NETPythonJSPNode.JSRubySSHGratis SSLCron jobsGitBackup
Oderland logo
fr. 231 kr/mån
Utrymme: 20 - 30 GBTrafik: 2000 - 5000 GBDomäner: ObegränsatMySQL: ObegränsatMSSQL: 0 st E-postkonton: ObegränsatKontrollpanel: cPanelPHP Memory Limit: 2048 MB
PHPASP.NETPythonJSPNode.JSRubySSHGratis SSLCron jobsGitBackup
Inleed logo
fr. 19 kr/mån
Utrymme: 2 - 50 GBTrafik: 50 - 3000 GBDomäner: ObegränsatMySQL: ObegränsatMSSQL: 0 st E-postkonton: ObegränsatKontrollpanel: DirectAdminPHP Memory Limit: 1024 - 8192 MB
PHPASP.NETPythonJSPNode.JSRubySSHGratis SSLCron jobsGitBackup
Simply.com logo
fr. 7 kr/månfr. 50 kr/mån
Utrymme: 10 - 200 GBTrafik: ObegränsatDomäner: ObegränsatMySQL: 2 - 15 stMSSQL: 0 - 3 st E-postkonton: ObegränsatKontrollpanel: EgenutveckladPHP Memory Limit: 512 - 1024 MB
PHPASP.NETPythonJSPNode.JSRubySSHGratis SSLCron jobsGitBackup
One.com logo
fr. 11 kr/månfr. 74 kr/mån
Utrymme: 50 - 750 GBTrafik: ObegränsatDomäner: 1 - 10 stMySQL: 1 - 20 stMSSQL: 0 st E-postkonton: ObegränsatKontrollpanel: EgenutveckladPHP Memory Limit: 512 - 8192 MB
PHPASP.NETPythonJSPNode.JSRubySSHGratis SSLCron jobsGitBackup
Hostinger logo
fr. 25 kr/månfr. 46 kr/mån
Utrymme: 50 - 100 GBTrafik: 100 GB - ObegränsatDomäner: 1 - 100 stMySQL: 2 st - ObegränsatMSSQL: 0 st E-postkonton: 1 - 100 stKontrollpanel: EgenutveckladPHP Memory Limit: 768 - 1024 MB
PHPASP.NETPythonJSPNode.JSRubySSHGratis SSLCron jobsGitBackup
Priserna för webbhotell visas inkl. moms avrundat till hela kronor. Priset avser det billigaste webbhotellpaketet. Avvikelser kan förekomma.