Project E - Converteer afbeeldingen
01 - Projectoverzicht
- In dit project maak je een Python-script dat afbeeldingen omzet naar een ander formaat.
- Het script helpt wanneer je grote PNG-bestanden kleiner wilt maken of afbeeldingen geschikt wilt maken voor een website.
- Je gebruikt een testmap met afbeeldingen en een aparte uitvoermap voor de geconverteerde bestanden.
- Het script opent elke afbeelding, wijzigt eventueel het formaat en bewaart een kopie als JPG, PNG of WebP.
- Het resultaat is een map met geconverteerde afbeeldingen waarbij de originele bestanden blijven bestaan.
- Je gebruikt AI om Python-code te laten maken met duidelijke variabelen voor invoermap, uitvoermap, formaat en kwaliteit.
- Je voert de code uit in VS Code en controleert daarna of de nieuwe afbeeldingen geopend kunnen worden.
- Als de kwaliteit of grootte niet goed is, verbeter je de prompt met concrete waarden voor breedte, hoogte en compressie.
02 - Projectmap en Python-omgeving
Voorkennis: doorloop de voorgaande projecten. Het doel en gebruik van .venv zijn uitgelegd in project A, blok 02. Voor ieder nieuw project maak je een eigen omgeving; hieronder herhaal je die bekende stappen.
- Maak een eigen projectmap
project_een open die map in VS Code. Maak daarin straksafbeeldingen.py. - Deze oefeningen voer je lokaal uit in de terminal van VS Code, omdat ze bestanden op je computer lezen of schrijven. Gebruik hiervoor de Python-installatie uit de basiscursus.
- Controleer je Python-versie. Werkt
pythonop macOS of Linux niet, gebruik danpython3voor het aanmaken van de omgeving.
python --version
python -m venv .venv
Activeer de omgeving. In Windows PowerShell:
.venv\Scripts\Activate.ps1
In de Windows-opdrachtprompt (cmd):
.venv\Scripts\activate.bat
Op macOS of Linux:
source .venv/bin/activate
Kies in VS Code via Python: Select Interpreter de interpreter uit .venv. Gebruik vanaf nu de geactiveerde terminal. Je verlaat de omgeving later met deactivate.
Een package is een extra pakket met Python-modules. pip is het installatiehulpmiddel; python -m pip gebruikt het bij de actieve Python. Installeer Pillow nu in de projectomgeving. De werking van het pakket volgt vóór de opdracht in blok 04.
python -m pip install Pillow
03 - Testgegevens voorbereiden
Maak invoer met een grote JPG-foto en een PNG-afbeelding met transparantie. Gebruik bijvoorbeeld een foto van 2000 × 1000 pixels en een kleine afbeelding van 400 × 200 pixels. De uitvoermap wordt uitvoer.
Het doel is JPG met maximaal 1200 × 1200 pixels. Transparante delen krijgen een witte achtergrond. De originele verhoudingen blijven behouden en kleine afbeeldingen worden niet vergroot.
04 - Begrippen en hulpmiddelen vóór de opdracht
- Een package is een installeerbaar pakket met modules. pip is het installatiehulpmiddel van Python.
python -m pipstart het bij de gekozen Python. Pillow is de pakketnaam; de code importeert de modules onder de naamPIL. - Pixels zijn de beeldpunten van een afbeelding. RGB bewaart rood, groen en blauw; RGBA voegt een transparantiekanaal A toe. JPG bewaart RGB zonder transparantie.
Image.openopent een afbeelding.thumbnailverkleint binnen de gekozen grenzen;convertverandert de kleurmodus;pasteplakt op een achtergrond;saveschrijft de kopie.- EXIF is metadata van een foto, zoals oriëntatie en soms opnamedatum.
exif_transposedraait het beeld volgens die oriëntatie.
ImageOps.exif_transposeverwerkt de oriëntatie die een camera kan opslaan.thumbnailverkleint met behoud van verhouding.- JPG ondersteunt geen transparantie. Daarom plakken we de afbeelding met haar transparantiemasker op een witte RGB-achtergrond.
- Kwaliteit 85 is een instelbare compressiewaarde. Een kleiner aantal pixels betekent niet bij ieder bronbestand automatisch minder bytes.
05 - Een gerichte AI-prompt maken
Geef AI eerst een concrete opdracht. Kopieer bijvoorbeeld deze prompt en vergelijk het antwoord met de voorbeeldcode in het volgende blok:
Maak met Pillow een beginnersscript dat afbeeldingen direct uit invoer naar
JPG converteert. Accepteer .jpg, .jpeg, .png en .webp. Corrigeer EXIF-
oriëntatie, beperk tot 1200x1200 zonder vergroten, zet transparantie op wit
en sla op met kwaliteit 85. Gebruik als doel de volledige bronnaam plus
.jpg, dus foto.png.jpg. Bewaar originelen, sla bestaande doelen en
symbolische links over en meld onleesbare afbeeldingen per bestand.
Vraag om uitleg bij onbekende regels en controleer welke bestanden de code leest en schrijft voordat je haar uitvoert. Gebruik de oefengegevens uit dit project.
06 - Een werkende basisversie
Dit is een complete basisversie voor afbeeldingen.py. Neem de code over of vergelijk haar met het antwoord van AI.
from pathlib import Path
from PIL import Image, ImageOps, UnidentifiedImageError
BASIS = Path(__file__).resolve().parent
INVOER = BASIS / "invoer"
UITVOER = BASIS / "uitvoer"
MAXIMAAL = (1200, 1200)
KWALITEIT = 85
def main():
if not INVOER.is_dir():
print(f"Map ontbreekt: {INVOER}")
return
UITVOER.mkdir(exist_ok=True)
for bron in sorted(INVOER.iterdir()):
if bron.is_symlink() or not bron.is_file():
continue
if bron.suffix.lower() not in {".jpg", ".jpeg", ".png", ".webp"}:
continue
doel = UITVOER / f"{bron.name}.jpg"
if doel.exists():
print(f"Bestaat al: {doel.name}")
continue
try:
with Image.open(bron) as afbeelding:
afbeelding = ImageOps.exif_transpose(afbeelding)
afbeelding.thumbnail(MAXIMAAL)
rgba = afbeelding.convert("RGBA")
resultaat = Image.new("RGB", rgba.size, "white")
resultaat.paste(rgba, mask=rgba.getchannel("A"))
resultaat.save(doel, "JPEG", quality=KWALITEIT)
print(f"{doel.name}: {resultaat.width} x {resultaat.height}")
except (OSError, UnidentifiedImageError) as fout:
print(f"Overgeslagen: {bron.name}: {fout}")
if __name__ == "__main__":
main()
07 - Het script uitvoeren
- Sla de volledige code op als
afbeeldingen.pyin je projectmap. Zet eventuele invoerbestanden op de plek die in blok 03 staat. - Open de geïntegreerde terminal in die projectmap en activeer
.venvals dat nog niet is gebeurd. - Voer het script uit met:
python afbeeldingen.py
Lees eerst de terminaluitvoer en open daarna eventuele uitvoerbestanden. Controleer het resultaat met blok 08 voordat je met eigen gegevens verdergaat.
08 - Het resultaat controleren
- Een liggende afbeelding van 2000 × 1000 wordt 1200 × 600. Een afbeelding van 400 × 200 blijft 400 × 200.
- Open de JPG van de transparante PNG: de achtergrond is wit en de afbeelding opent zonder fout.
- Maak een tekstbestand met extensie
.png. Het script meldt dit als onleesbaar en verwerkt de overige bestanden verder.
09 - Fouten herkennen en oplossen
- ModuleNotFoundError voor PIL? Installeer
Pillowmet dezelfde Python-omgeving waarmee je het script uitvoert. - Nieuwe kwaliteit geeft hetzelfde bestand? Bestaande doelen worden overgeslagen. Verwijder alleen de oefenuitvoer of kies een nieuwe uitvoermap.
10 - Uitbreiden en afronden
Probeer deze vervolgstap pas als de basis werkt:
Laat AI WebP als tweede uitvoerformaat toevoegen met behoud van transparantie. Vergelijk bij dezelfde afmetingen de bestandsgrootte en zichtbare kwaliteit.
Een tweede uitbreiding combineert deze nieuwe kennis met project D: EXIF kan ook de opnamedatum bevatten. Laat AI bij foto’s eerst die datum proberen en bij ontbrekende of ongeldige EXIF de wijzigingsdatum gebruiken. Laat de uitvoer steeds de gebruikte datumbron tonen en behoud de testmodus uit D.
Bewaar je werkende basisversie en verander één onderdeel tegelijk. Geef AI bij een fout de foutmelding, het relevante stukje code, je testinvoer en de verwachte uitkomst.
Het project is afgerond wanneer de basiscontrole uit blok 08 slaagt en je in eigen woorden kunt uitleggen welke invoer wordt gebruikt, hoe de verwerking werkt en waar de uitvoer terechtkomt.
Naslag: Pillow-handleiding.