Tips en Trucs 2020

JPEG compressie optimaliseren met jpegoptim

De fotoresolutie van smartphones en digitale camera's neemt elke dag toe. Het wordt dan ook steeds moeilijker om foto's te delen, op cloudsystemen op te slaan of op apparaten met beperkte opslagcapaciteit te bewaren. Grafische ontwerpers kampen met dezelfde problemen en gebruiken hulpmiddelen die de afbeeldingen comprimeren om ze aan hun klanten voor te leggen.

Jpegoptim installeren

De jpegoptim opdracht is aanwezig in de standaard openSUSE softwarebronnen. Je installeert jpegoptim met de opdracht:

dany@pindabook:~> sudo zypper install jpegoptim
[sudo] wachtwoord voor root: 
Gegevens van opslagruimte laden...
Lezen van geïnstalleerde pakketten...
Pakketafhankelijkheden oplossen...

Het volgende NIEUWE pakket zal worden geïnstalleerd:
  jpegoptim

1 nieuw te installeren pakket.
Totale downloadgrootte: 32,9 KiB. Reeds in de cache: 0 B. Na de bewerking zal aanvullend 56,5 KiB worden gebruikt.
Doorgaan? [j/n/v/...? alle opties tonen] (j): 
pakket jpegoptim-1.4.6-lp152.3.5.x86_64 wordt opgehaald                                        (1/1),  32,9 KiB ( 56,5 KiB uitgepakt)
Ophalen: jpegoptim-1.4.6-lp152.3.5.x86_64.rpm ...............................................................................[gereed]

Controleren op conflicten tussen bestanden: .................................................................................[gereed]
(1/1) Installeren van: jpegoptim-1.4.6-lp152.3.5.x86_64 .....................................................................[gereed]

Je kunt de versie van het programma en de installatie van jpegoptim controleren met de opdracht:

dany@pindabook:~> jpegoptim --version
jpegoptim v1.4.6  x86_64-suse-linux-gnu
Copyright (C) 1996-2018, Timo Kokkonen

This program comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to redistirbute it under certain conditions.
See the GNU General Public License for more details.


libjpeg version: 8d  15-Jan-2012
Copyright (C) 1991-2017 The libjpeg-turbo Project and many others

Afbeeldingscompressie optimaliseren

Dit kan op verschillende manieren, met verschillende eigenschappen.

Een enkele afbeelding verliesloos comprimeren

Om een enkele foto zonder kwaliteitsverlies te comprimeren, gebruik je de volgende opdracht:

dany@pindabook:~> jpegoptim Afbeeldingen/desktop2.jpeg
Afbeeldingen/desktop2.jpeg 1920x1080 24bit N JFIF  [OK] 424852 --> 370092 bytes (12.89%), optimized.

Deze opdracht overschrijft echter het originele bestand. Zorg voor alle zekerheid dus eerst voor een kopie.

Om de afbeelding nog verder te comprimeren, kan je de opdracht nogmaals uitvoeren. Indien jpegoptim het bestand niet verder kan verkleinen, wordt er geen bewerking op uitgevoerd (skipped).

dany@pindabook:~> jpegoptim Afbeeldingen/desktop2.jpeg
Afbeeldingen/desktop2.jpeg 1920x1080 24bit N JFIF  [OK] 370092 --> 370092 bytes (0.00%), skipped.

Een afbeelding naar een andere map comprimeren

Om de originele afbeelding te bewaren, kan je jpegoptim het gecomprimeerde bestand in een andere laten opslaan. Met de volgende opdracht maken we daarvoor een nieuwe map aan.

dany@pindabook:~> mkdir Afbeeldingen/Gecomprimeerd
dany@pindabook:~> jpegoptim -d Afbeeldingen/Gecomprimeerd -p Afbeeldingen/desktop.jpeg 
Afbeeldingen/desktop.jpeg 1920x1080 24bit N JFIF  [OK] 515934 --> 446976 bytes (13.37%), optimized.

De -d (--dest) optie zorgt dat de gecomprimeerde bestanden in de opgegeven map terecht komen. De -p (--preserve) zorgt dat de wijzigingsdatum van het oorspronkelijke bestand wordt overgenomen.

Hoe groot is de potentiële compressie?

Als je op voorhand wilt weten hoeveel een afbeelding gecomprimeerd kan worden, kan je een simulatie uitvoeren. De volgende opdrachten tonen hoe dit werkt. Eerst controleren we de grootte van het afbeeldingsbestand, daarna voeren we een simulatie uit en controleren opnieuw de bestandsgrootte van de afbeelding.

dany@pindabook:~> ls -l Afbeeldingen/desktop.jpeg
-rw-r--r-- 1 dany users 515934 11 okt 17:57 Afbeeldingen/desktop.jpeg
dany@pindabook:~> jpegoptim -n Afbeeldingen/desktop.jpeg 
Afbeeldingen/desktop.jpeg 1920x1080 24bit N JFIF  [OK] 515934 --> 446976 bytes (13.37%), optimized.
dany@pindabook:~> ls -l Afbeeldingen/desktop.jpeg
-rw-r--r-- 1 dany users 515934 11 okt 17:57 Afbeeldingen/desktop.jpeg

Dit bewijst dat het afbeeldingsbestand door de jpegoptim simulatie niet werd aangepast. De -n (--noaction) optie zorgt voor de simulatie.

Verlieslatend comprimeren

Soms willen we beter comprimeren ten nadele van de afbeeldingskwaliteit. Je kunt daarbij zelf bepalen hoeveel kwaliteitsverlies aanvaardbaar is. En dit kan op twee manieren.

Met een kwaliteitsfactor

Met de -m (--max) bepaal je de maximale fotokwaliteit (0 to 100). Met deze optie mag jpegoptim de fotokwaliteit van een bestand met een hogere kwaliteit verlagen tot de opgegeven kwaliteit, ten voordele van een kleinere bestandsgrootte. Indien de originele foto reeds een lagere kwaliteit heeft, wordt deze lagere kwaliteit behouden.

dany@pindabook:~> jpegoptim -m10 -d Afbeeldingen/Gecomprimeerd -p Afbeeldingen/strand.jpg 
Afbeeldingen/strand.jpg 1920x1080 24bit N  [OK] 330350 --> 50065 bytes (84.84%), optimized.

Dit was de originele foto:

Originele foto

En zo ziet de foto eruit na compressie met een kwaliteitsfactor 10:

Kwaliteit 10
Met een bepaalde bestandsgrootte

Met de optie --size kan je de uiteindelijke bestandsgrootte vastleggen in absolute grootte (KB) of als een percent van de oorspronkelijke bestandsgrootte:

dany@pindabook:~> jpegoptim --size=100 -d Afbeeldingen/Gecomprimeerd -p Afbeeldingen/strand.jpg 
Afbeeldingen/strand.jpg 1920x1080 24bit N  [OK] jpegoptim: target file already exists: /usr/home/Documents/Afbeeldingen/Gecomprimeerd/strand.jpg

Je merkt dat een reeds naar een andere map gecomprimeerde afbeelding niet standaard wordt overschreven. Dit kan je forceren met de optie --overwrite:

dany@pindabook:~> jpegoptim --size=100 --overwrite -d Afbeeldingen/Gecomprimeerd -p Afbeeldingen/strand.jpg 
Afbeeldingen/strand.jpg 1920x1080 24bit N  [OK] 330350 --> 103064 bytes (68.80%), optimized.

Een stapel afbeeldingen comprimeren

Je kunt jpegoptim meerdere te optimaliseren afbeeldingsbestanden ineens laten verwerken door ze simpelweg allemaal op te geven. Eerst maken we de map met gecomprimeerde afbeeldingen leeg, om daarna drie verschillenden afbeeldingen in één keer te comprimeren:

dany@pindabook:~> rm Afbeeldingen/Gecomprimeerd/*
dany@pindabook:~> jpegoptim -d Afbeeldingen/Gecomprimeerd -p Afbeeldingen/Achtergronden/beach_aerial_view_sea_158784_1920x1080.jpg Afbeeldingen/Achtergronden/beach_stones_sunset_143526_1920x1080.jpg Afbeeldingen/Achtergronden/beach_tropics_sea_sand_grass_84749_1920x1080.jpg 
Afbeeldingen/Achtergronden/beach_aerial_view_sea_158784_1920x1080.jpg 1920x1080 24bit N  [OK] 1282070 --> 1226076 bytes (4.37%), optimized.
Afbeeldingen/Achtergronden/beach_stones_sunset_143526_1920x1080.jpg 1920x1080 24bit N  [OK] 375767 --> 371195 bytes (1.22%), optimized.
Afbeeldingen/Achtergronden/beach_tropics_sea_sand_grass_84749_1920x1080.jpg 1920x1080 24bit N  [OK] 330350 --> 327482 bytes (0.87%), optimized.

Om alle JPEG-afbeeldingen in een map in één keer te comprimeren kan je jokers zoals het * gebruiken:

dany@pindabook:~> rm Afbeeldingen/Gecomprimeerd/*
dany@pindabook:~> jpegoptim -d Afbeeldingen/Gecomprimeerd -p Afbeeldingen/Achtergronden/*.jpg
Afbeeldingen/Achtergronden/arbor_tree_nursery_vegetation_china_60381_1920x1080.jpg 1920x1080 24bit N  [OK] 710265 --> 702719 bytes (1.06%), optimized.
Afbeeldingen/Achtergronden/autumn_trees_arch_133445_1920x1080.jpg 1920x1080 24bit N  [OK] 487969 --> 481199 bytes (1.39%), optimized.
Afbeeldingen/Achtergronden/beach_aerial_view_sea_158784_1920x1080.jpg 1920x1080 24bit N  [OK] 1282070 --> 1226076 bytes (4.37%), optimized.
...
Afbeeldingen/Achtergronden/waterfall_moss_stones_161559_1920x1080.jpg 1920x1080 24bit N  [OK] 899873 --> 877030 bytes (2.54%), optimized.
Afbeeldingen/Achtergronden/water_ripples_sea_137844_1920x1080.jpg 1920x1080 24bit N  [OK] 551314 --> 537978 bytes (2.42%), optimized.
Afbeeldingen/Achtergronden/willow_autumn_lake_evening_4843_1920x1080.jpg 1920x1080 24bit N  [OK] 558783 --> 554703 bytes (0.73%), optimized.

Om het resultaat te beoordelen kan je met de opdracht ls zowel de originele als de gecomprimeerde map onderzoeken:

dany@pindabook:~> ls -l Afbeeldingen/Achtergronden/ 
totaal 46696
-rw-r--r-- 1 dany users  710265 14 mei 19:36 arbor_tree_nursery_vegetation_china_60381_1920x1080.jpg
-rw-r--r-- 1 dany users  487969 18 mei 08:46 autumn_trees_arch_133445_1920x1080.jpg
-rw-r--r-- 1 dany users 1282070 31 jan  2020 beach_aerial_view_sea_158784_1920x1080.jpg
...
-rw-r--r-- 1 dany users  899873 21 feb  2020 waterfall_moss_stones_161559_1920x1080.jpg
-rw-r--r-- 1 dany users  551314 18 mei 01:24 water_ripples_sea_137844_1920x1080.jpg
-rw-r--r-- 1 dany users  558783 14 mei 22:30 willow_autumn_lake_evening_4843_1920x1080.jpg
dany@pindabook:~> ls -l Afbeeldingen/Gecomprimeerd/ 
totaal 45540
-rw-r--r-- 1 dany users  702719 14 mei 19:36 arbor_tree_nursery_vegetation_china_60381_1920x1080.jpg
-rw-r--r-- 1 dany users  481199 18 mei 08:46 autumn_trees_arch_133445_1920x1080.jpg
-rw-r--r-- 1 dany users 1226076 31 jan  2020 beach_aerial_view_sea_158784_1920x1080.jpg
...
-rw-r--r-- 1 dany users  877030 21 feb  2020 waterfall_moss_stones_161559_1920x1080.jpg
-rw-r--r-- 1 dany users  537978 18 mei 01:24 water_ripples_sea_137844_1920x1080.jpg
-rw-r--r-- 1 dany users  554703 14 mei 22:30 willow_autumn_lake_evening_4843_1920x1080.jpg

Telkens wordt op de eerste regel de totale bestandsgrootte in KB weergegeven. Je merkt dat in het voorbeeld zo'n 2,5% ruimte wordt vrijgemaakt. De ruimtewinst kan afhankelijk van de oorspronkelijke afbeeldingen flink oplopen, zeker als je de kwaliteit iets naar beneden haalt. Zo merkt je bijna geen verschil tussen kwaliteit 80 en 90, maar is de bestandsgrootte wel merkbaar kleiner.

Bash script

Om het comprimeren te automatiseren kan je de jpegoptim opdracht in een script gebruiken. In het volgende eenvoudige script wordt een map voor de gecomprimeerde afbeeldingen aangemaakt. Daarna worden alle JPEG afbeeldingen in de actieve (huidige) map zonder verlies gecomprimeerd. Om het script te schrijven, maak je gebruik van een teksteditor zoals nano:

dany@pindabook:~> nano bin/comprimeerAlles.sh

Het script wordt:

#!/bin/sh
# comprimeer alle *.jpg bestanden in de actieve map
# en plaats ze in de map Gecomprimeerd
# met dezelfde wijzigingsdatum als de oorspronkelijke bestanden.

mkdir Gecomprimeerd

for i in *.jpg; do jpegoptim -d ./Gecomprimeerd -p "$i"; done

Sla het script op met de sneltoets Ctrl+s en verlaat nano met de sneltoets Ctrl+x. Om het script te kunnen uitvoeren (starten), voer je de volgende opdracht uit:

dany@pindabook:~> chmod +x bin/comprimeerAlles.sh

We testen het script op de afbeeldingen in de map Afbeeldingen/Achtergronden/. M.a.w. Eerst betreden (openen) we deze map en voeren daarna ons script uit:

dany@pindabook:~> cd Afbeeldingen/Achtergronden/
dany@pindabook:~/Afbeeldingen/Achtergronden> comprimeerAlles.sh 
arbor_tree_nursery_vegetation_china_60381_1920x1080.jpg 1920x1080 24bit N  [OK] 710265 --> 702719 bytes (1.06%), optimized.
autumn_trees_arch_133445_1920x1080.jpg 1920x1080 24bit N  [OK] 487969 --> 481199 bytes (1.39%), optimized.
beach_aerial_view_sea_158784_1920x1080.jpg 1920x1080 24bit N  [OK] 1282070 --> 1226076 bytes (4.37%), optimized.
...
waterfall_moss_stones_161559_1920x1080.jpg 1920x1080 24bit N  [OK] 899873 --> 877030 bytes (2.54%), optimized.
water_ripples_sea_137844_1920x1080.jpg 1920x1080 24bit N  [OK] 551314 --> 537978 bytes (2.42%), optimized.
willow_autumn_lake_evening_4843_1920x1080.jpg 1920x1080 24bit N  [OK] 558783 --> 554703 bytes (0.73%), optimized.

Opnieuw controleren we de inhoud van de aangemaakte map met gecomprimeerde afbeeldingen:

dany@pindabook:~/Afbeeldingen/Achtergronden> ls -l Gecomprimeerd/
totaal 45540
-rw-r--r-- 1 dany users  702719 14 mei 19:36 arbor_tree_nursery_vegetation_china_60381_1920x1080.jpg
-rw-r--r-- 1 dany users  481199 18 mei 08:46 autumn_trees_arch_133445_1920x1080.jpg
-rw-r--r-- 1 dany users 1226076 31 jan  2020 beach_aerial_view_sea_158784_1920x1080.jpg
...
-rw-r--r-- 1 dany users  877030 21 feb  2020 waterfall_moss_stones_161559_1920x1080.jpg
-rw-r--r-- 1 dany users  537978 18 mei 01:24 water_ripples_sea_137844_1920x1080.jpg
-rw-r--r-- 1 dany users  554703 14 mei 22:30 willow_autumn_lake_evening_4843_1920x1080.jpg

Handleiding

Om nogmeer uit jpegoptim te halen, kan je de handleiding met alle opties raadplegen met de opdracht:

dany@pindabook:~> man jpegoptim
jpegoptim manual

Opruimen

Om op te ruimen, verwijder ik de twee gebruikte mappen met gecomprimeerde afbeeldingen (rm -r opdrachten). Daarna wordt het script verwijderd en uiteindelijk het jpegoptim pakket zelf. De cd opdrachten zorgen dat we vertrekken vanuit de juiste map.

dany@pindabook:~/Afbeeldingen/Achtergronden> rm -r Gecomprimeerd/
dany@pindabook:~/Afbeeldingen/Achtergronden> cd ..
dany@pindabook:~/Afbeeldingen> rm -r Gecomprimeerd/
dany@pindabook:~/Afbeeldingen> cd 
dany@pindabook:~> rm bin/comprimeerAlles.sh
dany@pindabook:~> sudo zypper remove -u jpegoptim
[sudo] wachtwoord voor root: 
Lezen van geïnstalleerde pakketten...
Pakketafhankelijkheden oplossen...

Het volgende pakket zal worden VERWIJDERD:
  jpegoptim

1 te verwijderen pakket.
Na de bewerking zal 56,5 KiB worden vrijgemaakt.
Doorgaan? [j/n/v/...? alle opties tonen] (j): 
(1/1) Verwijderen van jpegoptim-1.4.6-lp152.3.5.x86_64 ......................................................................[gereed]
Er zijn actieve programma's die nog steeds bestanden en bibliotheken gebruiken die verwijderd of bijgewerkt zijn door recente opwaarderingen. Ze zouden opnieuw gestart moeten worden om voordeel te hebben van de laatste vormen van bijwerken. Voer 'zypper ps -s' uit om een lijst met deze programma's te maken.
 
Kernbibliotheken or -services zijn bijgewerkt.
Opnieuw opstarten is vereist om te verzekeren dat uw systeem voordeel heeft bij dit bijwerken.