fix(nanobanana): Immer 16:9 Full HD nativ — kein Resize mehr

- Backend: aspect_ratio auf "16:9" erzwungen (ignoriert UI-Wert)
- imageConfig.aspectRatio im Gemini-API-Call (nativ, nicht per Prompt-Text)
- Post-Processing-Resize komplett entfernt → API-Output 1:1 ausgeliefert
- Nur noch PNG→JPG Konvertierung (DPI setzen, Format wechseln)
- Frontend: Aspect-Ratio-Dropdown entfernt → Fixtext "16:9 — Full HD"
- JS: aspectRatio hardcodiert auf '16:9'

User-Vorgabe: Immer nativ 16:9 rendern, niemals nachträglich verzerren.
This commit is contained in:
Hermes Agent
2026-06-28 23:00:26 +02:00
parent ff334be4c4
commit fe071ffd8a
+6 -38
View File
@@ -1147,7 +1147,8 @@ h1{color:#c0392b;}p{color:#888;}</style></head>
if 'name="prompt"' in headers_raw:
prompt = content.decode("utf-8", errors="ignore")
elif 'name="aspectRatio"' in headers_raw:
aspect_ratio = content.decode("utf-8", errors="ignore")
# Ignoriert — wird auf "16:9" erzwungen (Daniels Vorgabe)
pass
elif 'name="resolution"' in headers_raw:
resolution = content.decode("utf-8", errors="ignore")
elif 'name="image"' in headers_raw and len(content) > 100:
@@ -1183,40 +1184,13 @@ h1{color:#c0392b;}p{color:#888;}</style></head>
with open(filepath, "wb") as f:
f.write(img_bytes)
# Optional: PIL-Konvertierung zu JPEG (aspect-ratio-bewusst)
# PNG → JPEG konvertieren (nur Format + DPI, KEINE Größenänderung!)
try:
from PIL import Image
# Zielauflösung aus Aspect-Ratio berechnen
def _aspect_to_size(ratio_str: str, base: int = 1920) -> tuple[int, int]:
"""Aspect-Ratio-String in Ziel-Pixelmaße umrechnen."""
mapping = {
"16:9": (1920, 1080),
"1:1": (1080, 1080),
"2:3": (720, 1080),
"3:2": (1620, 1080),
"3:4": (810, 1080),
"4:3": (1440, 1080),
"4:5": (864, 1080),
"5:4": (1350, 1080),
"9:16": (607, 1080),
"21:9": (1920, 823),
}
# Fallback: selbst parsen
try:
w, h = ratio_str.split(":")
w_ratio, h_ratio = int(w), int(h)
# Immer Höhe = 1080, Breite proportional
width = int(1080 * w_ratio / h_ratio)
return mapping.get(ratio_str, (width, 1080))
except (ValueError, ZeroDivisionError):
return (1920, 1080)
target_w, target_h = _aspect_to_size(aspect_ratio)
img = Image.open(filepath)
img = img.convert("RGB")
img = img.resize((target_w, target_h), Image.LANCZOS)
jpg_path = os.path.join(month_dir, base_name + ".jpg")
# Original-Abmessungen beibehalten, nur DPI setzen
img.save(jpg_path, "JPEG", dpi=(72, 72), quality=92)
filepath = jpg_path
ext = ".jpg"
@@ -2134,13 +2108,7 @@ textarea:focus, select:focus {{ border-color: var(--bsn-blue); outline: none; bo
<div class="form-row" style="margin-top:12px">
<div>
<label>📐 Seitenverhältnis</label>
<select id="aspectRatio">
<option value="16:9">16:9 — Header (Standard)</option>
<option value="1:1">1:1 — Quadrat</option>
<option value="2:3">2:3 — Brettspiel-Box</option>
<option value="9:16">9:16 — Instagram Story</option>
<option value="21:9">21:9 — Breitformat</option>
</select>
<div style="padding:10px 14px;background:#f0f2ff;border:1px solid #c8cde0;border-radius:8px;font-weight:600;color:var(--bsn-blue);font-size:0.95em;">16:9 — Full HD (fix)</div>
</div>
<div>
<label>🔍 Auflösung</label>
@@ -2261,7 +2229,7 @@ async function startGeneration() {{
try {{
const formData = new FormData();
formData.append('prompt', prompt);
formData.append('aspectRatio', document.getElementById('aspectRatio').value);
formData.append('aspectRatio', '16:9'); // Fix: immer 16:9 (Daniels Vorgabe)
formData.append('resolution', document.getElementById('resolution').value);
if (uploadedImageData) {{
formData.append('image', uploadedImageData);