Astridkraft commited on
Commit
fa064ff
·
verified ·
1 Parent(s): 202d583

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +56 -42
app.py CHANGED
@@ -42,6 +42,27 @@ def create_face_mask(image, bbox_coords, face_preserve):
42
 
43
  return mask
44
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
45
  def auto_detect_face_area(image):
46
  """Optimierten Vorschlag für Gesichtsbereich ohne externe Bibliotheken"""
47
  width, height = image.size
@@ -323,12 +344,14 @@ def img_to_image(image, prompt, neg_prompt, strength, steps, guidance_scale,
323
 
324
 
325
  def update_bbox_from_image(image):
326
- """Aktualisiert die Bounding-Box-Koordinaten wenn ein Bild hochgeladen wird"""
327
  if image is None:
328
- return None, None, None, None
329
 
330
  bbox = auto_detect_face_area(image)
331
- return bbox[0], bbox[1], bbox[2], bbox[3]
 
 
332
 
333
  def main_ui():
334
  with gr.Blocks(
@@ -426,12 +449,21 @@ def main_ui():
426
  gr.Markdown("**Lade ein Bild hoch und beschreibe die gewünschte Veränderung:**")
427
 
428
  with gr.Row():
429
- img_input = gr.Image(
430
- type="pil",
431
- label="Eingabebild",
432
- height=300,
433
- sources=["upload"] # Nur Upload-Button anzeigen
434
- )
 
 
 
 
 
 
 
 
 
435
 
436
  with gr.Row():
437
  with gr.Column():
@@ -474,43 +506,15 @@ def main_ui():
474
  face_preserve = gr.Checkbox(
475
  label="Gesicht, Tier, Gegenstand beibehalten",
476
  value=True,
477
- info="Aktiviert: Bildelement bleibt erhalten, Hintergrund wird verändert | Deaktiviert: Nur Bildelement wird verändert"
478
  )
479
 
480
- with gr.Row():
481
- gr.Markdown("**Bildelementbereich anpassen**")
482
-
483
- with gr.Row():
484
- bbox_x1 = gr.Number(
485
- label="Links (x1)",
486
- value=100,
487
- precision=0,
488
- info="Linke Kante des Gesichtsbereichs"
489
- )
490
- bbox_y1 = gr.Number(
491
- label="Oben (y1)",
492
- value=100,
493
- precision=0,
494
- info="Obere Kante des Gesichtsbereichs"
495
- )
496
- bbox_x2 = gr.Number(
497
- label="Rechts (x2)",
498
- value=300,
499
- precision=0,
500
- info="Rechte Kante des Gesichtsbereichs"
501
- )
502
- bbox_y2 = gr.Number(
503
- label="Unten (y2)",
504
- value=300,
505
- precision=0,
506
- info="Untere Kante des Gesichtsbereichs"
507
- )
508
-
509
  with gr.Row():
510
  gr.Markdown(
511
  "**Achtung:**\n"
512
  "• **Automatische Bildelementerkennung** setzt Koordinaten beim Upload\n"
513
- "• **Koordinaten nur bei erkennbaren Verzerrungen anpassen** (Bereiche leicht verschieben)"
 
514
  )
515
 
516
 
@@ -523,13 +527,23 @@ def main_ui():
523
  type="pil"
524
  )
525
 
526
- # Event-Handler für Bild-Upload
527
  img_input.change(
528
  fn=update_bbox_from_image,
529
  inputs=[img_input],
530
- outputs=[bbox_x1, bbox_y1, bbox_x2, bbox_y2]
531
  )
532
 
 
 
 
 
 
 
 
 
 
 
533
  transform_btn.click(
534
  fn=img_to_image,
535
  inputs=[
 
42
 
43
  return mask
44
 
45
+ def create_mask_preview(image, bbox_x1, bbox_y1, bbox_x2, bbox_y2, face_preserve):
46
+ """Erstellt eine Vorschau der Maske auf dem Originalbild"""
47
+ if image is None or None in [bbox_x1, bbox_y1, bbox_x2, bbox_y2]:
48
+ return None
49
+
50
+ # Bild kopieren für Vorschau
51
+ preview = image.copy()
52
+ draw = ImageDraw.Draw(preview)
53
+
54
+ # Rechteck zeichnen basierend auf face_preserve
55
+ if face_preserve:
56
+ # GESICHTSERHALTUNG: Roter Rahmen um geschützten Bereich
57
+ draw.rectangle([bbox_x1, bbox_y1, bbox_x2, bbox_y2], outline="red", width=3)
58
+ draw.text((bbox_x1, bbox_y1-25), "GESCHÜTZT", fill="red")
59
+ else:
60
+ # NUR GESICHT VERÄNDERN: Grüner Rahmen um Veränderungsbereich
61
+ draw.rectangle([bbox_x1, bbox_y1, bbox_x2, bbox_y2], outline="green", width=3)
62
+ draw.text((bbox_x1, bbox_y1-25), "WIRD VERÄNDERT", fill="green")
63
+
64
+ return preview
65
+
66
  def auto_detect_face_area(image):
67
  """Optimierten Vorschlag für Gesichtsbereich ohne externe Bibliotheken"""
68
  width, height = image.size
 
344
 
345
 
346
  def update_bbox_from_image(image):
347
+ """Aktualisiert die Bounding-Box-Koordinaten und erstellt Vorschau wenn ein Bild hochgeladen wird"""
348
  if image is None:
349
+ return None, None, None, None, None
350
 
351
  bbox = auto_detect_face_area(image)
352
+ # Erstelle Vorschau mit Standard-Gesichtserhaltung (True)
353
+ preview = create_mask_preview(image, bbox[0], bbox[1], bbox[2], bbox[3], True)
354
+ return bbox[0], bbox[1], bbox[2], bbox[3], preview
355
 
356
  def main_ui():
357
  with gr.Blocks(
 
449
  gr.Markdown("**Lade ein Bild hoch und beschreibe die gewünschte Veränderung:**")
450
 
451
  with gr.Row():
452
+ with gr.Column():
453
+ img_input = gr.Image(
454
+ type="pil",
455
+ label="Eingabebild mit Masken-Vorschau",
456
+ height=300,
457
+ sources=["upload"] # Nur Upload-Button anzeigen
458
+ )
459
+ with gr.Column():
460
+ gr.Markdown("**📐 Masken-Koordinaten**")
461
+ with gr.Row():
462
+ bbox_x1 = gr.Number(label="Links (x1)", value=100, precision=0)
463
+ bbox_y1 = gr.Number(label="Oben (y1)", value=100, precision=0)
464
+ with gr.Row():
465
+ bbox_x2 = gr.Number(label="Rechts (x2)", value=300, precision=0)
466
+ bbox_y2 = gr.Number(label="Unten (y2)", value=300, precision=0)
467
 
468
  with gr.Row():
469
  with gr.Column():
 
506
  face_preserve = gr.Checkbox(
507
  label="Gesicht, Tier, Gegenstand beibehalten",
508
  value=True,
509
+ info="🔴 ROT: Element geschützt | 🟢 GRÜN: Element wird verändert"
510
  )
511
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
512
  with gr.Row():
513
  gr.Markdown(
514
  "**Achtung:**\n"
515
  "• **Automatische Bildelementerkennung** setzt Koordinaten beim Upload\n"
516
+ "• **Koordinaten anpassen** um Bereich zu vergrößern/verkleinern\n"
517
+ "• **Farbiger Rahmen** zeigt an was geschützt/verändert wird"
518
  )
519
 
520
 
 
527
  type="pil"
528
  )
529
 
530
+ # Event-Handler für Bild-Upload - Jetzt MIT Vorschau
531
  img_input.change(
532
  fn=update_bbox_from_image,
533
  inputs=[img_input],
534
+ outputs=[bbox_x1, bbox_y1, bbox_x2, bbox_y2, img_input]
535
  )
536
 
537
+ # Event-Handler für Live-Masken-Vorschau bei Koordinaten-Änderungen
538
+ coordinates_inputs = [bbox_x1, bbox_y1, bbox_x2, bbox_y2, face_preserve]
539
+
540
+ for coordinate in coordinates_inputs:
541
+ coordinate.change(
542
+ fn=create_mask_preview,
543
+ inputs=[img_input] + coordinates_inputs,
544
+ outputs=img_input
545
+ )
546
+
547
  transform_btn.click(
548
  fn=img_to_image,
549
  inputs=[