HEIC-Fotos annehmen und den Ausschnitt weiter fassen
iPhones fotografieren HEIC; ohne pillow-heif wies die Bildpruefung jedes Foto ab. Dazu: ein erkannter Vogel ohne bestimmbare Art wird nicht mehr als "kein Vogel" gemeldet, und der Ausschnitt fuer die Sammlung ist quadratisch.
This commit is contained in:
1 parent
dbec78aa7a
commit
f572c20080
9 files changed
+285
-8
No files matched your search
+23
-2
@@ -28,6 +28,24 @@ import io
|
||||
from django.core.files.uploadedfile import InMemoryUploadedFile, UploadedFile
|
||||
from PIL import Image, ImageOps, UnidentifiedImageError
|
||||
|
||||
# 🔴 **Ohne das kann Pillow kein HEIC — und iPhones fotografieren HEIC.**
|
||||
#
|
||||
# Am 14.10.2026 wies die Instanz jedes Foto von Christians iPhone mit 400 ab,
|
||||
# Minuten nachdem die Bildprüfung ausgerollt war. Die Prüfung war richtig, nur
|
||||
# kannte sie das Format nicht, das die Hälfte aller Telefone erzeugt. Eine
|
||||
# App für iOS, die kein HEIC annimmt, nimmt nichts an.
|
||||
#
|
||||
# ⚠️ Der Import darf das Hochladen nicht zum Absturz bringen, wenn das Paket
|
||||
# in einer schlanken Umgebung fehlt — dann bleibt es bei JPEG und PNG, und die
|
||||
# Meldung an den Nutzer sagt, welches Format es war.
|
||||
try: # pragma: no cover - haengt an der Umgebung, nicht am Code
|
||||
import pillow_heif
|
||||
|
||||
pillow_heif.register_heif_opener()
|
||||
HEIC_LESBAR = True
|
||||
except ImportError: # pragma: no cover
|
||||
HEIC_LESBAR = False
|
||||
|
||||
# ⚠️ Pillow öffnet sehr große Bilder bereitwillig und belegt dabei Speicher in
|
||||
# der Größenordnung Breite × Höhe × 4 Bytes. Ein Bild mit absurden Maßen in
|
||||
# einer winzigen Datei ist der billigste Weg, einen Dienst umzuwerfen
|
||||
@@ -40,7 +58,7 @@ MAX_KANTE = 2400
|
||||
|
||||
# Was wir annehmen. Bewusst eine kurze Liste bekannter Rasterformate — kein
|
||||
# SVG (das ist ein Dokument mit Skripten, kein Bild) und kein animiertes GIF.
|
||||
ERLAUBT = {"JPEG", "PNG", "WEBP", "HEIF", "HEIC", "MPO"}
|
||||
ERLAUBT = {"JPEG", "PNG", "WEBP", "HEIF", "HEIC", "AVIF", "MPO"}
|
||||
|
||||
|
||||
class KeinBild(Exception):
|
||||
@@ -65,7 +83,10 @@ def saeubern(datei: UploadedFile, name: str | None = None) -> InMemoryUploadedFi
|
||||
# unbrauchbar. Deshalb danach neu öffnen statt weiterzuarbeiten.
|
||||
bild.verify()
|
||||
except (UnidentifiedImageError, OSError, ValueError) as fehler:
|
||||
raise KeinBild(f"keine lesbare Bilddatei: {fehler}") from fehler
|
||||
# ⚠️ Den Hinweis auf HEIC mitgeben: Ohne ihn sucht man den Fehler beim
|
||||
# Telefon, und er liegt an einem fehlenden Paket auf dem Server.
|
||||
hinweis = "" if HEIC_LESBAR else " (HEIC wird hier nicht unterstützt — pillow-heif fehlt)"
|
||||
raise KeinBild(f"keine lesbare Bilddatei{hinweis}: {fehler}") from fehler
|
||||
|
||||
datei.seek(0)
|
||||
try:
|
||||
|
||||
Reference in new issue
Block a user