Cimage - Hur fungerar det?

By . Latest revision .

En väg att gå med optimering och manipulering av bilder är att använda moduler för det. Vi ska jobba med Mikael Roos egenbyggda Cimage, som bland annat ger oss tillgång till följande funktionalitet:

  • Resize, crop
  • Filter
  • Quality, file size

Vi ska kolla lite närmre på hur man kan använda sig av detta och hur ni kan använda det i eran portfolio för att dels matcha färgschemat ni går efter men även för att minska storleken på de filer som laddas in.

#Installation & Användning

För att använda Cimage behöver man installera det via Composer och sätta upp en cache-mapp, där de bearbetade bilderna hamnar, och en redirect regel i vår .htaccess. Detta har vi dock redan löst i den installation ni fått börja med i kursen, så vi kan köra vidare med hur man arbetar med Cimage.

Våra bilder ligger i nuläget i mappen assets/img och vi kan nå dem genom %assets_url%/img i våra .twig-filer eller ![me](%assets_url%/img) i våra Markdown. Då hämtar den in bilderna “raw”, det fungerar men nu vill vi stället använda Cimage. Vi kollar på redirect regeln som ligger i .htaccess så kan vi se hur vi kan göra det.

De två rader vi är intresserade av är rad 12 och 19 för mig, de innehåller följande:

RewriteRule ^image/(.*)$ /~niaa16/dbwebb-kurser/design/me/portfolio/assets/cimage/img.php?src=$1 [QSA,NC,L]
...
RewriteRule ^image/(.*)$ assets/cimage/img.php?src=$1 [QSA,NC,L]

Den översta är för studentservern och den undre är för vår lokala miljö. Den säger att får Apache (vår webbserver) en förfrågan på image/ så kommer den skicka den förfrågan till Cimage istället, som kommer att hantera den (och arbeta emot assets/img/). Som exempel kan vi ta assets/img/leaf_256x256.png som är dbwebb lövet och se hur det först laddas in via Markdown:

# Laddar in bilden som vanligt
![Leaf](%assets_url%/img/leaf_256x256.png)
# Laddar in bilden via Cimage
![Leaf](image/leaf_256x256.png)

Och i våra .twig-filer är det inte svårare än såhär:

# Som vanligt
<img class="flash-img" src="{{ assets_url }}/img/leaf_256x256.png">
# Via Cimage
<img class="flash-img" src="{{ base_url }}/image/leaf_256x256.png">

Då vet vi hur vi laddar in bilder via Cimage, då kan vi köra vidare med att se vad den kan hjälpa oss att göra.

#Ändra storlek & beskärning

Hur stretch och crop-to-fit kan se ut

Hur stretch och crop-to-fit kan se ut

Vi börjar med att kolla hur vi kan ändra storleken på bilden. Cimage håller koll på vad den behöver göra genom förfrågan den får genom webbläsaren. Så t.ex image/leaf_256x256.png?w=150&h=150 ger en bild som är 150x150 pixlar stor. Om vi bara sätter bredden ?w=150 så behåller den sin aspect ratio på 1:1 men minskar bredden till 150px. Det går även att använda samma parameterar för att göra bilden större, t.ex. image/leaf_256x256.png?w=1500&h=1500 ger en 1500x1500 pixlar stor bild, även om det kanske inte hade sett så bra ut när orginalet är 250x250.

Det finns även möjlighet att stretcha sina bilder eller köra en crop-to-fit, vilket är två andra vanliga sätt att jobba med bilder. Vi kollar på ett exempel som visar båda:

![Leaf](image/leaf_256x256.png?h=250&w=50&stretch)
![Leaf](image/leaf_256x256.png?h=250&w=50&crop-to-fit)

Stretch kan fungera, men är oftast inget man vill göra då det förstör bildens aspect ratio. Det finns en del andra regler som man kan jobba med, som går att läsa mer om i dokumentationen för cimage.

Vi kan även jobba med %, det kan vara trevligt för att slippa behöva räkna ut vad man bör använda. T.ex. så har jag min header-bild som är 6000x3375 och landar på 1.7MB stor, det känns tungt för min sida, så jag väljer att minska den till 50% av dess originalbredd:

![Leaf](image/header.jpg?width=50%)

Nu är den istället 273 KB, dvs 16% av storleken av ursprungsbilden i storlek, utan någon märkbar skillnad i kvalité. Det känns bra och gör att min sida går snabbare att ladda in, även på sämre linor.

#Beskärning

Om man vill beskära sin bild så kan man använda sig av regeln ?area=. Area säger vilken del av bilden vi faktiskt vill ha ut och tar emot 4 värden i ordningen top,right,bottom,left och mäts i %. Som exempel kan vi hämta ut halva dbwebb-lövet på följande sätt:

![Leaf](image/leaf_256x256.png?area=50,0,0,0)
![Leaf](image/leaf_256x256.png?area=0,50,0,0)
![Leaf](image/leaf_256x256.png?area=0,0,50,0)
![Leaf](image/leaf_256x256.png?area=0,0,0,50)
Hur man kan använda area för att beskära

Hur man kan använda area för att beskära

Hur man kan använda area för att beskära

Hur man kan använda area för att beskära

Vi kan även beskära en specifik del av bilden genom att använda ?crop= som tar emot fyra värden i ordningen width, height, start_x, start_y. Ett exempel på detta kan vara att beskära de mittersta 50x50 på lövet.

![Leaf](image/leaf_256x256.png?crop=50,50,100,100)

Till höger kan du se hur resultatet blev.

#Kvalité & filstorlek

En av de viktigare funktionerna med att använda ett sånt här verktyg är att vi kan optimera våra bilder så de går snabbare att ladda in på hemsidan.

Filformat är en viktig del i det hela och vi kan spara en del plats genom att använda t.ex. .jpg eller .gif istället för .png som normalt sett brukar vara större. Cimage hjälper oss med detta genom att erbjuda ?save-as som tillåter oss att konvertera bilder mellan olika format, där bland gif, jpg och png.

![Leaf](image/header.jpg?width=50%&save-as=jpg)
![Leaf](image/header.jpg?width=50%&save-as=png)
![Leaf](image/header.jpg?width=50%&save-as=gif)

Min header-bild som jag jobbade med tidigare i artikeln är redan en .jpg fil och tjänar därför inget på att laddas in som ?save-as=jpg. Dock så kan jag istället använda mig av quality, ?q= för att sätta kvalitén i ett procent värde. Jag testar att sätta 10% i kvalité, då ser jag att himlen tappar märkbart i kvalité. Jag höjer med 10% intervaller upp till 50% (?q=50) och får något som ser snarlikt ut min header.jpg?width=50 men där jag har skalat bort ytterligare 33KB (13%) av storleken.

![Leaf](image/header.jpg?width=50%)
![Leaf](image/header.jpg?width=50%&q=50)

Vi kan se att det stora hoppet i filstorlek är att gå ifrån .png till .jpg, men det är även ett stort hopp i att minska bredden och sen ytterligare ett hopp att minska kvalitén. Vill man se ett tydligt exempel på vad de lägre stegen i kvalité kan göra både på bilden och filstorleken finns det ett bra exempel i dokumentationen, JPEG quality settings.

URL Storlek Skillnad
image/header.jpg 1700KB 100%
image/header.jpg?width=50% 273KB 16%
image/header.jpg?width=50%&q=50 240KB 14.1%

#Filter

Det finns en mängd filter man kan se på “Filters and convolution” och “Filters and effects from PHP GD” men tabellen nedan nämner de som är mest av intresse.

Filter URL Example
Lighten ?convolve=lighten image/header.jpg?width=50%&convolve=lighten
Darken ?convolve=darken image/header.jpg?width=50%&convolve=darken
Blur ?blur image/header.jpg?width=50%&blur
Grayscale ?f=grayscale image/header.jpg?width=50%&f=grayscale
Brightness ?f=brightness,VALUE image/header.jpg?width=50%&f=brightness,50
Contrast ?f=constrast,VALUE image/header.jpg?width=50%&f=contrast,50

#Felsökning

Ibland kan något gå fel eller inte fungera som man vill. En bra start är att lägga på flaggan ?nc som står för no-cache. Den ser till att skapa om bilden ifall något i cachen skulle gått fel.

Nästa steg är att lägga på ?v flaggan, som ger oss verbose output. Den kan ta en stund att ladda in och man kan behöva öppna bilden i en ny flik för att få se utskriften.

#Avslutningsvis

Om du vill läsa mer om vad som kan göras i Cimage rekommenderar jag att skumma igenom dokumentationen som du kan hitta här.

Hojta till om något är oklart!

#Revision history

  • 2020-11-26: (A, nik) Skapad inför HT2020.

Document source.

Category: design, cimage.