Ein Bild- & PDF-Konvertierungs-Tool für Python mit moderner GUI (Qt/PySide6) und CLI für Automatisierung. Konvertiert einzelne Dateien oder ganze Stapel zwischen allen gängigen Bildformaten und PDF — mit EXIF-Verwaltung, Zielgrößen-Modus und Größenprognose.
- Alle gängigen Bildformate: JPEG, PNG, BMP, TIFF, GIF, WebP, ICO — plus HEIC/HEIF und AVIF als Eingabe (iPhone-Fotos)
- PDF in beide Richtungen: Bilder als PDF speichern oder PDF-Seiten als Bild exportieren (Seitenauswahl, alle Seiten, DPI-Wahl)
- SVG-Eingabe: Vektorgrafiken in jeder Größe rastern — über DPI oder eine exakte Zielbreite; Transparenz bleibt erhalten
- Batch-Verarbeitung: Warteschlange mit Mini-Vorschauen in der GUI, Globs wie
*.jpgund parallele Verarbeitung in der CLI - Sammel-PDF: mehrere Bilder (und PDF-Seiten) zu einer mehrseitigen PDF zusammenfassen
- EXIF-Metadaten: automatisch korrekte Bildausrichtung, Metadaten wahlweise übernehmen, komplett entfernen oder gezielt bearbeiten (Autor, Copyright, Datum, …)
- Wasserzeichen: Text oder Logo-Bild, mit Position und Deckkraft
- Presets: mitgeliefert (
web,email,archiv) oder eigene speichern — in GUI und CLI - Zielgröße statt Qualität: „max. 500 KB“ angeben — die passende Qualität wird automatisch gesucht (JPEG/WebP)
- Überschreibschutz: vorhandene Dateien bleiben erhalten, Ausgaben weichen auf
name (1).extaus - Animierte GIFs/WebPs behalten bei GIF↔WebP ihre Animation
- Anpassbare Qualität/Kompression, Auflösungsänderung mit Seitenverhältnis-Erhalt und Größenprognose vor der Konvertierung
- Moderne Oberfläche: folgt dem System-Theme (umschaltbar), Live-Vorschau, PDF-Seitennavigation, Ergebnis inline mit „Ordner öffnen“, Einstellungen bleiben zwischen Sitzungen erhalten
- Zweisprachig: Deutsch/Englisch — automatisch nach Systemsprache, direkt in der GUI umschaltbar (Auto/DE/EN) oder per
PICCONVERTER_LANG=de|en - Zwei Modi: GUI für interaktive Nutzung, CLI für Skripte und Automatisierung
Fertige Programme (ohne Python): Unter Releases liegen Windows-.exe-, Linux- und macOS-Builds (Apple Silicon) zum Direktstart.
macOS: Die App ist nicht signiert (kein Apple-Developer-Zertifikat). Beim ersten Start meldet Gatekeeper „beschädigt“ oder „nicht verifiziert“ — einmalig die Quarantäne aufheben, danach startet die App normal:
xattr -d com.apple.quarantine /Pfad/zu/PicConverter.app
Aus dem Quellcode:
git clone https://github.com/0xGI0/PicConverter.git
cd PicConverter
pip install -r requirements.txtDas installiert:
| Paket | Zweck |
|---|---|
Pillow |
Bildverarbeitung |
PySide6 |
Moderne GUI (Qt) — Drag & Drop und HiDPI inklusive |
PyMuPDF |
PDF → Bild und SVG → Bild (optional — Bild → PDF geht auch ohne) |
pillow-heif |
HEIC/HEIF-Eingabe (optional) |
Als Paket installieren (optional): Danach stehen die Befehle picconverter und picconverter-gui systemweit zur Verfügung:
pip install .[all] # oder: pipx install .[all]Startmenü-Eintrag (Linux, nach Paketinstallation):
cp picconverter.desktop ~/.local/share/applications/
mkdir -p ~/.local/share/icons/hicolor/512x512/apps
cp assets/icon.png ~/.local/share/icons/hicolor/512x512/apps/picconverter.pngDie SHA-256-Prüfsumme jedes Release-Downloads steht in den Release-Notes
(Abschnitt „Checksums“) und in der ans Release angehängten SHA256SUMS.txt.
Prüfsumme der heruntergeladenen Datei berechnen:
# Windows (PowerShell)
Get-FileHash .\<datei> -Algorithm SHA256:: Windows (CMD)
certutil -hashfile <datei> SHA256# macOS / Linux
shasum -a 256 <datei>Stimmt der Wert mit dem in den Release-Notes überein, ist die Datei unverändert und vollständig angekommen.
Build-Herkunft prüfen (Releases nach v3.2.0): Mit der GitHub CLI lässt sich zusätzlich nachweisen, dass die Datei von GitHub Actions aus genau diesem Repository und Commit gebaut wurde (Sigstore-Attestierung):
gh attestation verify <datei> --owner 0xGI0PGP-Signatur prüfen (ab v3.2.0): Die Assets werden vom
Maintainer zusätzlich lokal mit PGP signiert; die Signatur hängt als
<datei>.asc mit am Release. Public Key einmalig importieren:
curl -fsSLO https://tertlidis.com/pgp.asc
gpg --import pgp.ascDann die Signatur gegen die heruntergeladene Datei prüfen:
gpg --verify <datei>.asc <datei>Erwartet wird „Good signature from Georgios Tertlidis“ (auf deutschen Systemen „Korrekte Signatur von Georgios Tertlidis“). Der Fingerprint zum Gegenprüfen:
D251 773E 1DF7 0C1D 0476 1CB0 F92A F40D 80E8 5351
- Signierte Releases — SHA-256-Checksums, Sigstore-Build-Attestierung und PGP-Signaturen, prüfbar wie oben unter „Verify your download“ beschrieben
- SBOM je Release — Stückliste der eingebetteten Abhängigkeiten (CycloneDX-JSON) als Release-Asset
- CodeQL — statische Code-Analyse (Python + Actions) je Push und wöchentlich
- Secret Scanning — mit Push Protection
- Bandit + pip-audit — Security-Linting und CVE-Prüfung der Abhängigkeiten in jedem CI-Lauf
- Dependabot — monatliche Update-PRs für pip-Abhängigkeiten und gepinnte Actions
- OpenSSF Scorecard — kontinuierliche Bewertung der Supply-Chain-Praxis (Badge oben)
- Lücke gefunden? — Meldeweg in SECURITY.md
python picconverter_gui.py # oder: picconverter-gui- Bilder, PDFs oder SVGs per Drag & Drop ins Fenster ziehen oder über „Dateien auswählen" laden — mehrere Dateien bilden eine Warteschlange (mit Mini-Vorschauen und ✕ zum Entfernen), bei PDFs erscheint eine Seitennavigation
- Optional ein Preset wählen oder die aktuellen Einstellungen als eigenes Preset speichern
- Ausgabeformat wählen (inkl. PDF); bei Zielformat PDF lassen sich alle Eingaben zu einer PDF zusammenfassen
- Qualität anpassen — oder eine Zielgröße in KB festlegen (JPEG/WebP)
- Optional: Wasserzeichen-Text mit Position und Deckkraft, neue Auflösung, „Größe schätzen" für eine Prognose
- EXIF-Metadaten wahlweise entfernen oder über „Anzeigen / Bearbeiten" einzelne Felder ändern
- „Konvertieren starten" — das Ergebnis erscheint direkt in der Oberfläche, „📂 Ordner öffnen" führt zu den Dateien; vorhandene Dateien werden nicht überschrieben (abschaltbar)
Über den Schalter oben rechts lässt sich zwischen System, Dunkel und Hell umschalten. Alle Einstellungen bleiben für den nächsten Start erhalten.
python picconverter_cli.py <eingaben...> -f <format> [optionen]Beispiele:
# JPG zu PNG
python picconverter_cli.py foto.jpg -f png
# Batch: alle JPGs zu WebP in einen Ausgabeordner
python picconverter_cli.py *.jpg -f webp -q 85 -o ausgabe/
# Auf maximal 500 KB komprimieren (Qualität wird automatisch gesucht)
python picconverter_cli.py foto.jpg -f jpg --target-size 500
# Bild als PDF speichern
python picconverter_cli.py foto.jpg -f pdf
# Alle Seiten einer PDF als PNG exportieren (300 DPI)
python picconverter_cli.py dokument.pdf -f png --page all --dpi 300
# SVG in fester Pixelbreite rastern (Vektor bleibt scharf)
python picconverter_cli.py logo.svg -f png --svg-width 1024
# Mehrere Scans zu einer mehrseitigen PDF zusammenfassen
python picconverter_cli.py scan1.png scan2.png -f pdf --merge -o dokument.pdf
# EXIF-Metadaten entfernen bzw. bearbeiten
python picconverter_cli.py foto.jpg -f jpg --strip-exif
python picconverter_cli.py foto.jpg -f jpg --exif-set "Artist=Max Mustermann" --exif-set Copyright=
# Preset anwenden bzw. eigene speichern
python picconverter_cli.py foto.jpg --preset web
python picconverter_cli.py --save-preset klein -f jpg -q 40 -w 1280
# Wasserzeichen (Text oder Logo)
python picconverter_cli.py foto.jpg -f jpg --watermark-text "© 2026" --watermark-pos unten-links
python picconverter_cli.py foto.jpg -f png --watermark-image logo.png --watermark-opacity 30
# Nur Größenprognose (ohne zu konvertieren)
python picconverter_cli.py bild.jpg -f webp -q 85 --estimateOptionen:
| Option | Kürzel | Beschreibung | Beispiel |
|---|---|---|---|
--format |
-f |
Zielformat (erforderlich) | -f png |
--output |
-o |
Ausgabedatei oder -ordner | -o bild.jpg |
--quality |
-q |
Qualität/Kompression | -q 90 |
--target-size |
Zielgröße in KB (JPEG/WebP) | --target-size 500 |
|
--width |
-w |
Breite in Pixeln¹ | -w 1920 |
--height |
Höhe in Pixeln¹ | --height 1080 |
|
--page |
PDF-Seite oder all (Standard: 1) |
--page all |
|
--dpi |
PDF-/SVG-Render-DPI (Standard: 150) | --dpi 300 |
|
--svg-width |
SVG auf exakte Pixelbreite rastern | --svg-width 1024 |
|
--merge |
Alles in eine PDF (nur -f pdf) |
--merge |
|
--strip-exif |
EXIF-Metadaten entfernen | --strip-exif |
|
--exif-set |
EXIF-Feld setzen/löschen | --exif-set Artist=Ich |
|
--watermark-text |
Text-Wasserzeichen | --watermark-text "© 2026" |
|
--watermark-image |
Logo-Wasserzeichen | --watermark-image logo.png |
|
--watermark-pos |
Position (Standard: unten-rechts) | --watermark-pos mitte |
|
--watermark-opacity |
Deckkraft in % (Standard: 50) | --watermark-opacity 30 |
|
--preset |
Preset anwenden | --preset web |
|
--save-preset |
Optionen als Preset speichern | --save-preset klein |
|
--overwrite |
Vorhandene Dateien ersetzen | --overwrite |
|
--jobs |
Parallele Konvertierungen | --jobs 8 |
|
--estimate |
Nur Größe schätzen | --estimate |
|
--quiet |
Nur Fehler ausgeben | --quiet |
|
--version |
Version anzeigen | --version |
¹ Wird nur eine Dimension angegeben, wird die andere seitenverhältnistreu ergänzt.
Hinweis: -h ist für --help reserviert, daher --height für die Höhe.
EXIF-Felder für --exif-set: ImageDescription, Artist, Copyright, Software, DateTime, Make, Model — ein leerer Wert (--exif-set Copyright=) löscht das Feld.
| Format | Eingabe | Ausgabe | Qualitätseinstellung | Bereich |
|---|---|---|---|---|
| JPEG | ✅ | ✅ | Qualität | 1–100 |
| PNG | ✅ | ✅ | Kompression | 0–9 |
| WebP | ✅ | ✅ | Qualität | 0–100 |
| BMP | ✅ | ✅ | – | – |
| TIFF | ✅ | ✅ | Kompression | 0–9 |
| GIF | ✅ | ✅ | – | – |
| ICO | ✅ | ✅ | – | – |
| ✅ (benötigt PyMuPDF) | ✅ | – | – | |
| SVG | ✅ (benötigt PyMuPDF) | – | – | – |
| HEIC/HEIF | ✅ (benötigt pillow-heif) | – | – | – |
| AVIF | ✅ (Pillow ≥ 11) | – | – | – |
- JPEG/WebP: Höhere Werte = bessere Qualität (Standard: 85 bzw. 80)
- PNG: Niedrigere Werte = bessere Qualität (Standard: 6)
- TIFF: LZW-Kompression wird automatisch angewendet
- Transparenz: JPEG, BMP und PDF unterstützen keine Transparenz — sie wird automatisch durch Weiß ersetzt
- EXIF: wird in JPEG, PNG, WebP und TIFF übernommen; die Bildausrichtung (Orientation) wird beim Laden eingerechnet, damit Hochkant-Fotos korrekt bleiben
- Animation: GIF↔WebP behält alle Frames; bei anderen Zielformaten wird das erste Frame verwendet (mit Hinweis)
- SVG: wird als Vektor neu gezeichnet statt hochskaliert — jede Zielgröße bleibt scharf. Ohne Angabe gilt 150 DPI,
--svg-width(CLI) bzw. die Zielbreite (GUI) rendert auf exakt diese Pixelbreite. SVGs ganz ohne Maßangaben und ohneviewBoxlanden mangels Größeninformation auf einer Letter-Seite
| Komponente | Details |
|---|---|
| Python-Version | 3.9+ |
| Architektur | picconverter_core (gemeinsame Logik) + CLI + GUI + picconverter_i18n |
| Bildverarbeitung | Pillow (PIL) |
| PDF-/SVG-Rendering | PyMuPDF (optional, für PDF → Bild und SVG → Bild) |
| HEIC/HEIF | pillow-heif (optional) |
| GUI-Framework | PySide6 (Qt 6) — natives Wayland, Drag & Drop und Per-Monitor-HiDPI inklusive |
| Konfiguration | ~/.config/picconverter/ (Presets, GUI-Einstellungen) |
| Tests & Lint | pytest + ruff, CI via GitHub Actions |
| Releases | PyInstaller-Binaries (Windows/Linux/macOS) per Git-Tag |
ModuleNotFoundError: No module named 'PySide6' (oder 'PIL')
pip install -r requirements.txtGUI ist zu klein oder zu groß (HiDPI)
Qt erkennt die Display-Skalierung selbst (unter Wayland sogar pro Monitor). Falls das Ergebnis nicht passt, lässt sich der Faktor manuell setzen:
PICCONVERTER_SCALE=1.5 python picconverter_gui.py„PDF-Eingabe benötigt PyMuPDF" / „SVG-Eingabe benötigt PyMuPDF"
PDF → Bild und SVG → Bild brauchen den Renderer PyMuPDF (Bild → PDF geht auch ohne):
pip install pymupdfHEIC-Dateien werden nicht erkannt
pip install pillow-heifFalsche Sprache
Die Oberfläche folgt der Systemsprache; erzwingen lässt sie sich mit:
PICCONVERTER_LANG=de picconverter-gui # oder =enBeiträge sind willkommen! Fork das Repository, erstelle einen Feature-Branch und öffne einen Pull Request. Tests laufen mit pytest tests/.
Feature-Ideen: passwortgeschützte PDFs, Konvertierungs-Verlauf, weitere Sprachen
Dieses Projekt steht unter der MIT-Lizenz.

