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.
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
Dit kan op verschillende manieren, met verschillende eigenschappen.
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.
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.
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.
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 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:
En zo ziet de foto eruit na compressie met een kwaliteitsfactor 10:
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.
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 -lAfbeeldingen/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.
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
Om nogmeer uit jpegoptim te halen, kan je de handleiding met alle opties raadplegen met de opdracht:
dany@pindabook:~> man jpegoptim
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.