Tips en Trucs 2014

Batch beeldbewerking

Onlangs moest ik voor een website talloze PNG-afbeeldingen omzetten naar het JPG-formaat. Daarenboven moesten de afbeeldingen verkleinen naar 18% van de originele grootte. Voor een paar afbeeldingen kan je een beeldbewerkingsprogramma zoals GIMP gebruiken, maar voor een paar honderd wordt dit een monnikenwerk. Vanzelfsprekend bevat GIMP een Batch Mode, maar dan moet je daarvoor de specifieke GIMP batch opdrachten leren gebruiken. Wie niets anders doet dan beeldbewerking, loont deze inspanning zonder twijfel. Maar mensen die vertrouwd zijn met bash script, kunnen beter deze kennis gebruiken om aan batch beeldbewerking te doen.

ImageMagick is de basis van menig beeldbewerkingsprogramma en kan je via opdrachten zoals convert vanaf de terminal gebruiken.

PNG afbeeldingen in een map verkleinen en omzetten naar JPG

De volgende opdrachten klaren de klus:

dany@linux-55yl:~> cd Foto\'s/
dany@linux-55yl:~/Foto's> for img in *.png
> do
> filename=${img%.*}
> convert -scale 18% "$filename.png" "$filename.jpg"
> done
dany@linux-55yl:~/Foto's>

De cd opdracht opent de map met de afbeeldingen.

In de for lus doorlopen we alle PNG bestandsnamen (*.png) en slaan deze op in de variabele img.

Uit de volledige PNG bestandsnaam filteren we het gedeelde voor de punt en slaan dit op in de variabele filename.

De convert opdracht verkleint (-scale) de PNG afbeelding ("$filename.png") en slaat deze op in een JPG bestand ("$filename.jpg").

De opdracht done sluit de lus af en zorgt voor het verwerken van de volgende PNG afbeelding. Zolang de for lus niet gesloten is, worden er groter dan tekens vooraan de regels geplaatst. Pas na het afsluiten van de lus met done worden de opdrachten binnen de for lus daadwerkelijk uitgevoerd.

Na het uitvoeren van deze opdrachten staan de JPG-bestanden naast de PNG-bestanden in de map. Als je de PNG-bestanden niet meer nodig hebt, verwijder je ze met de volgende opdracht:

dany@linux-55yl:~/Foto's> rm *.png

Automatiseren

De lus en het verwijderen van de overgebleven PNG bestanden kan je met een alias in één opdracht stoppen:

dany@linux-55yl:~/Foto's> alias png2kleinjpg='for img in *.png; do filename=${img%.*}; convert -scale 18% "$filename.png" "$filename.jpg"; done; rm *.png'

Nu de lus en het verwijderen in één opdracht zit, moet je enkel nog de map met afbeeldingen openen en de nieuwe opdracht uitvoeren:

dany@linux-55yl:~/Foto's> cd
dany@linux-55yl:~> cd Foto\'s/
dany@linux-55yl:~/Foto's> png2kleinjpg

De eerste cd opdracht zorgt ervoor dat we terug in de Persoonlijke map werken.

Dit is al een pak gebruiksvriendelijker. Om het openen van de map in de opdracht te stoppen, werk je beter niet met een alias maar met een function:

dany@linux-55yl:~/Foto's> cd
dany@linux-55yl:~> unalias png2kleinjpg
dany@linux-55yl:~> function png2kleinjpg(){ cd "$1"; for img in *.png; do filename=${img%.*}; convert -scale 18% "$filename.png" "$filename.jpg"; done; rm *.png; }

De unalias opdracht verwijdert de png2kleinjpg alias, om plaats te maken voor de function png2kleinjpg.

In de function opdracht wordt de variabele $1 gebruikt om het eerste met de opdracht meegegeven argument voor te stellen. M.a.w. de function gebruik je nu als volgt:

dany@linux-55yl:~> png2kleinjpg Foto\'s/
dany@linux-55yl:~/Foto's> cd

Let op het feit dat je na het uitvoeren van onze function in de map Foto's blijft werken.

Om een lijst van gedefinieerde functions op te vragen, gebruik je de volgende opdracht:

dany@linux-55yl:~> typeset -f | more

De more pipe zorgt dat de uitvoer van de typeset -f opdracht scherm per scherm wordt weergegeven. Dit is ook nodig, want er zijn heel wat functions door uw gebruikte distributie gedefinieerd. Om het volgende scherm weer te geven druk je Spatie.

Bij het sluiten van de terminal worden alle aliassen en functions automatisch verwijdert. Als je een alias of function op regelmatige basis nodig hebt, plaats je de alias of function opdracht in het .bashrc bestand. Daarin staan alle opdrachten die bij het starten van elke terminal automatisch uitgevoerd worden.

Integreren in KDE

Terminal gebruikers kunnen de opdracht nu wel gebruiken, maar wat met de grafische KDE Desktop gebruikers. Om onze function in de bestandsbeheerder Dolphin op te nemen, maak je met KWrite het volgende tekstbestand aan:

[Desktop Action png2kleinjpg]
Exec=function png2kleinjpg(){ cd "$1"; for img in *.png; do filename=${img%.*}; convert -scale 18% "$filename.png" "$filename.jpg"; done; rm *.jpg; }; png2kleinjpg %f
Icon=image-x-generic
Name=PNG verkleinen en omzetten naar JPG

[Desktop Entry]
Actions=png2kleinjpg;
Icon=image-x-generic
MimeType=inode/directory;
Name=PNG verkleinen en omzetten naar JPG
ServiceTypes=KonqPopupMenu/Plugin
Type=Service

Sla dit bestand op in de map .kde4/share/kde4/services/servicemenus/. Let op de punt voor de mapnaam, deze wijst op een verborgen map die je het eenvoudigst kunt bereiken door bij het opslaan in de adresbalk zelf de mapnaam met het punt te typen. De map services en zijn submap servicemenus zul je hoogstwaarschijnlijk nog zelf moeten aanmaken.

De sectie Desktop Action png2kleinjpg bevat de instellingen voor ons snelmenu. Het snelmenu moet onze function uitvoeren (Exec). Daarbij definiëren we de function telkens opnieuw en voeren die dan direct uit met het argument %f. %f staat voor de map waarop de gebruiker de actie wil uitvoeren. Als pictogram (Icon) gebruik ik het standaard afbeeldingen pictogram. De naam (Name) van het snelmenu kan je ook zelf bepalen.

In de sectie Desktop Entry staan de algemene instellingen voor een Desktop bestand. Zo gaat het hier om een actie (Actions) die je zelf een naam mag geven. De naam moet wel overeenkomen met de naam in de Desktop Action sectie. Ook hier kan je een pictogram instellen. Het snelmenu moet enkel weergegeven worden bij mappen (MimeType). Ook hier kan je een naam instellen. De ServiceTypes bepalen in welke programma's het snelmenu actief is (hier enkel in Dolphin en de als bestandsbeheerder fungerende browser Konqueror). Het toevoegen van een functionaliteit aan een programma noemen ze hier een Service (Type).

Dolphin Service menu