Foto's indelen op basis van persoon
Misschien herken je dit: we hadden laatst een feestje (de verjaardag van mijn oudste), en heel wat foto’s gemaakt.
Omdat we een leuke activiteit hadden tijdens het feestje, had ik ook veel foto’s die ik specifiek even wilde delen met de ouders van die kinderen. Maar hoe pak je dat handig aan?
Ik had al wel de Personen-functie van de Foto’s app gebruikt, maar toen zat ik me af te vragen of ik dan speciaal slimme albums moest gaan aanmaken per persoon, dan exporteren per album, en dan opsturen…
Nee, het kan makkelijker. En zeker als het om veel mensen gaat is dit een fijne methode.
Oplossing in twee stappen
Het is voor deze oplossing nog steeds wel nodig dat je de foto’s eerst voorziet van de juiste personen. Nu wordt dat ook makkelijker, naar mate Foto’s steeds sneller zelf herkent wie er op de foto staan, maar in dit geval zat er even wat handwerk in.
Aan de andere kant: het is werk wat zich regelmatig nog terugbetaalt voor mij als ik het bijhoud. Dingen als “We maken een collage van de familie, heb je nog foto’s van [familielid X]?” worden ineens een stuk simpeler zo.
Nadat je de foto’s voorzien hebt van de juiste personen, kun je ineens alles tegelijk exporteren uit Foto’s. Deze foto’s bevatten nog steeds de gegevens over de personen, in de EXIF-data.
En dát is wat we kunnen gebruiken om de foto’s verder te verdelen.
Het script: verdeel de foto’s per map
Onderstaand script verwacht twee dingen:
- De map waar je foto’s nu staan
- De map waar de foto’s terecht moeten komen (als die niet bestaat, wordt het aangemaakt)
Vervolgens loopt het door alle foto’s heen, kijkt het welke personen genoemd zijn in die foto, en kopieert de foto dan naar de map met de naam van die persoon.
Wanneer er dus meer dan één persoon in de foto staat, heb je straks wel meer dan één kopie van de foto. Als Brent en Noah er bijvoorbeeld allebei op staan, heb je de foto één keer in het mapje “Brent” en één in het mapje “Noah”.
Om dit script te laten werken heb je ook ExifTool nodig, wat eenvoudig te installeren is met Homebrew via brew install exiftool.
En dan het script:
# heeft `exiftool` nodig: brew install exiftool
# de map waar je foto's nu staan
exported_photos_dir="pad/naar/je/fotos"
# map waar je foto's terecht moeten komen
sorted_photos_base_dir="pad/naar/fotos/doel"
mkdir -p "$sorted_photos_base_dir"
for photo in "$exported_photos_dir"/*; do
people=$(exiftool -PersonInImage "$photo" | awk -F ': ' '{print $2}')
# als er meer dan één persoon in de foto staat wordt dat komma-gescheiden
# op deze manier maken we dus een kopie voor ieder persoon, ipv de nieuwe map "Bob, Alice"
IFS=', ' read -r -a people_array <<< "$people"
for person in "${people_array[@]}"; do
person=$(echo "$person" | xargs)
person_dir="$sorted_photos_base_dir/$person"
mkdir -p "$person_dir"
cp "$photo" "$person_dir"
done
done
Zo kun je foto’s natuurlijk op meer manieren indelen, op basis van de EXIF-data. Denk bijvoorbeeld aan foto’s automatisch verdelen in verhouding (landschap, portret, of vierkant) wat enorm handig kan zijn als je bezig bent met een fotoboek.
Draai gewoon een keer exiftool "foto.jpg" op een foto, om te zien wat voor data er allemaal beschikbaar is.