fix: hochgeladene Logos auf Anzeigegroesse zuschneiden

Ein hochgeladenes Logo erschien auf der Willkommensseite deutlich
kleiner als ein automatisch gefundenes. Ursache ist nicht die CSS -
beide nutzen dieselbe Klasse - sondern der Bildinhalt: nach dem
Freistellen ist der Rand zwar durchsichtig, zaehlt aber weiter zur
Bildflaeche. .customer-logo skaliert mit object-fit: contain auf 120px
Hoehe, ein Logo mit breitem Rand erscheint dadurch nur einen Bruchteil
davon gross (gemessen: 30px statt 120px). Brandfetch-Logos sind bereits
eng beschnitten und fuellen den Kasten aus.

trim_transparent_border() schneidet die durchsichtigen Raender nach dem
Freistellen weg. Greift auch bei bereits transparenten PNGs; bei
abgewaehltem Freistellen passiert nichts, da es dort keinen
transparenten Rand gibt.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Erik Thiele
2026-09-02 15:06:20 +02:00
parent 9dae841461
commit 8de8a116bb
4 changed files with 27 additions and 1 deletions

View File

@@ -65,6 +65,22 @@ def _border_color(px, w, h):
return mitte, streuung <= LOGO_BORDER_UNIFORMITY
def trim_transparent_border(img):
"""Schneidet durchsichtige Raender weg, sodass das Logo die Bildflaeche
ausfuellt.
Ohne das erscheint ein hochgeladenes Logo kleiner als ein automatisch
gefundenes: die Willkommensseite skaliert mit object-fit: contain auf
eine feste Hoehe, und ein breiter durchsichtiger Rand zaehlt dabei mit.
Brandfetch-Logos sind bereits eng beschnitten."""
if img.mode != "RGBA":
return img
bbox = img.getchannel("A").getbbox()
if not bbox or bbox == (0, 0, img.width, img.height):
return img
return img.crop(bbox)
def remove_logo_background(image, tolerance=LOGO_TOLERANCE):
"""Stellt ein Logo frei: entfernt den zusammenhängenden Hintergrund von den
Rändern her und macht ihn transparent.
@@ -175,6 +191,13 @@ def save_uploaded_logo(file_storage, site, slot, freistellen=True):
else:
img = img.convert("RGBA")
# Nach dem Freistellen zuschneiden, damit das Logo genauso gross erscheint
# wie ein automatisch gefundenes
vorher = img.size
img = trim_transparent_border(img)
if img.size != vorher:
print(f"✅ Generate - Logo zugeschnitten: {vorher[0]}x{vorher[1]} → {img.size[0]}x{img.size[1]}")
logo_dir = os.path.join(MEDIA_DIR, site, LOGO_DIRNAME)
os.makedirs(logo_dir, exist_ok=True)
dateiname = f"logo_{slot}.png"