Surn commited on
Commit
caad215
·
1 Parent(s): c04c7e9

Implement sketchpad to add layers and paths

Browse files
Files changed (4) hide show
  1. README.md +1 -1
  2. app.py +40 -21
  3. modules/image_utils.py +3 -3
  4. style_20250128.css +1 -1
README.md CHANGED
@@ -5,7 +5,7 @@ colorFrom: yellow
5
  colorTo: purple
6
  sdk: gradio
7
  python_version: 3.10.13
8
- sdk_version: 5.20.0
9
  app_file: app.py
10
  pinned: false
11
  short_description: Transform Your Images into Mesmerizing Hexagon Grids
 
5
  colorTo: purple
6
  sdk: gradio
7
  python_version: 3.10.13
8
+ sdk_version: 5.20.1
9
  app_file: app.py
10
  pinned: false
11
  short_description: Transform Your Images into Mesmerizing Hexagon Grids
app.py CHANGED
@@ -415,7 +415,7 @@ def generate_image_to_image(prompt_mash, image_input_path, image_strength, steps
415
  return final_image
416
 
417
  @spaces.GPU(duration=140)
418
- def run_lora(prompt, image_input, image_strength, cfg_scale, steps, selected_index, randomize_seed, seed, width, height, lora_scale, enlarge, use_conditioned_image=False, progress=gr.Progress(track_tqdm=True)):
419
  if selected_index is None:
420
  raise gr.Error("You must select a LoRA before proceeding.🧨")
421
  print(f"input Image: {image_input}\n")
@@ -429,6 +429,10 @@ def run_lora(prompt, image_input, image_strength, cfg_scale, steps, selected_ind
429
  conditioned_image = open_image(current_prerendered_image.value).convert("RGB")
430
  image_input = crop_and_resize_image(conditioned_image, width, height)
431
  print(f"Conditioned Image: {image_input.size}.. converted to RGB and resized\n")
 
 
 
 
432
  selected_lora = loras[selected_index]
433
  lora_path = selected_lora["repo"]
434
  trigger_word = selected_lora["trigger_word"]
@@ -593,12 +597,34 @@ def update_prompt_visibility(map_option):
593
  gr.update(visible=is_visible),
594
  gr.update(visible=is_visible)
595
  )
 
 
 
 
 
 
 
 
 
 
 
 
 
596
 
597
  def replace_input_with_sketch_image(sketch_image):
598
  print(f"Sketch Image: {sketch_image}\n")
599
  sketch, is_dict = get_image_from_dict(sketch_image)
600
  return sketch
601
 
 
 
 
 
 
 
 
 
 
602
  @spaces.GPU()
603
  def getVersions():
604
  return versions_html()
@@ -665,35 +691,23 @@ with gr.Blocks(css_paths="style_20250128.css", title=title, theme='Surn/beeuty',
665
  image_mode="RGB",
666
  format="PNG"
667
  )
668
- def on_input_image_change(image_path):
669
- if image_path is None:
670
- gr.Warning("Please upload an Input Image to get started.")
671
- return None
672
- img, img_path = convert_to_rgba_png(image_path)
673
- return img_path
674
-
675
- input_image.input(
676
- fn=on_input_image_change,
677
- inputs=[input_image],
678
- outputs=[input_image], scroll_to_output=True,
679
- )
680
  with gr.Column(scale=0):
681
- with gr.Accordion("Sketch Pad (WIP)", open = False):
682
  with gr.Row():
683
  sketch_image = gr.Sketchpad(
684
  label="Sketch Image",
685
  type="filepath",
686
  #invert_colors=True,
687
- #source=['upload','canvas'],
688
  #tool=['editor','select','color-sketch'],
689
  placeholder="Draw a sketch or upload an image. Currently broken in gradio 5.17.1",
690
  interactive=True,
691
  elem_classes="centered solid imgcontainer",
692
  key="imgSketch",
693
- image_mode="RGB",
694
  format="PNG",
695
- width=512, # Default width
696
- height=512 # Default height
697
  )
698
  with gr.Row():
699
  with gr.Column(scale=1):
@@ -895,10 +909,15 @@ with gr.Blocks(css_paths="style_20250128.css", title=title, theme='Surn/beeuty',
895
  inputs=[input_image, composite_color, composite_opacity],
896
  outputs=[input_image]
897
  )
 
 
 
 
 
898
  #use conditioned_image as the input_image for generate_input_image_click
899
  generate_input_image_from_gallery.click(
900
  fn=run_lora,
901
- inputs=[prompt, input_image, image_strength, cfg_scale, steps, selected_index, randomize_seed, seed, width, height, lora_scale, enlarge_to_default, gr.State(True)],
902
  outputs=[input_image, seed, progress_bar], scroll_to_output=True
903
  )
904
  prerendered_image_gallery.select(
@@ -908,7 +927,7 @@ with gr.Blocks(css_paths="style_20250128.css", title=title, theme='Surn/beeuty',
908
  show_api=False, scroll_to_output=True
909
  )
910
  alpha_composite_slider.change(
911
- fn=alpha_composite_with_control,
912
  inputs=[input_image, sketch_image, alpha_composite_slider],
913
  outputs=[input_image],
914
  scroll_to_output=True
@@ -941,7 +960,7 @@ with gr.Blocks(css_paths="style_20250128.css", title=title, theme='Surn/beeuty',
941
  gr.on(
942
  triggers=[generate_button.click, prompt.submit],
943
  fn=run_lora,
944
- inputs=[prompt, input_image, image_strength, cfg_scale, steps, selected_index, randomize_seed, seed, width, height, lora_scale, enlarge_to_default, gr.State(False)],
945
  outputs=[input_image, seed, progress_bar]
946
  )
947
 
 
415
  return final_image
416
 
417
  @spaces.GPU(duration=140)
418
+ def run_lora(prompt, map_option, image_input, image_strength, cfg_scale, steps, selected_index, randomize_seed, seed, width, height, lora_scale, enlarge, use_conditioned_image=False, progress=gr.Progress(track_tqdm=True)):
419
  if selected_index is None:
420
  raise gr.Error("You must select a LoRA before proceeding.🧨")
421
  print(f"input Image: {image_input}\n")
 
429
  conditioned_image = open_image(current_prerendered_image.value).convert("RGB")
430
  image_input = crop_and_resize_image(conditioned_image, width, height)
431
  print(f"Conditioned Image: {image_input.size}.. converted to RGB and resized\n")
432
+ if map_option != "Prompt":
433
+ prompt = PROMPTS[map_option]
434
+ # negative_prompt = NEGATIVE_PROMPTS.get(map_option, "")
435
+
436
  selected_lora = loras[selected_index]
437
  lora_path = selected_lora["repo"]
438
  trigger_word = selected_lora["trigger_word"]
 
597
  gr.update(visible=is_visible),
598
  gr.update(visible=is_visible)
599
  )
600
+ def composite_with_control_sync(input_image, sketch_image, slider_value):
601
+ # Load the images using open_image() if they are provided as file paths.
602
+ in_img = open_image(input_image) if isinstance(input_image, str) else input_image
603
+ sk_img_path, _ = get_image_from_dict(sketch_image)
604
+ sk_img = open_image(sk_img_path)
605
+
606
+ # Resize sketch image if dimensions don't match input image.
607
+ if in_img.size != sk_img.size:
608
+ sk_img = sk_img.resize(in_img.size, Image.LANCZOS)
609
+
610
+ # Now composite using the original alpha_composite_with_control function.
611
+ result_img = alpha_composite_with_control(in_img, sk_img, slider_value)
612
+ return result_img
613
 
614
  def replace_input_with_sketch_image(sketch_image):
615
  print(f"Sketch Image: {sketch_image}\n")
616
  sketch, is_dict = get_image_from_dict(sketch_image)
617
  return sketch
618
 
619
+ def on_input_image_change(image_path):
620
+ if image_path is None:
621
+ gr.Warning("Please upload an Input Image to get started.")
622
+ return None, None
623
+ img, img_path = convert_to_rgba_png(image_path)
624
+ with Image.open(img_path) as pil_img:
625
+ width, height = pil_img.size
626
+ return [img_path, gr.update(width=width, height=height)]
627
+
628
  @spaces.GPU()
629
  def getVersions():
630
  return versions_html()
 
691
  image_mode="RGB",
692
  format="PNG"
693
  )
694
+
 
 
 
 
 
 
 
 
 
 
 
695
  with gr.Column(scale=0):
696
+ with gr.Accordion("Sketch Pad", open = False):
697
  with gr.Row():
698
  sketch_image = gr.Sketchpad(
699
  label="Sketch Image",
700
  type="filepath",
701
  #invert_colors=True,
702
+ #sources=['upload','canvas'],
703
  #tool=['editor','select','color-sketch'],
704
  placeholder="Draw a sketch or upload an image. Currently broken in gradio 5.17.1",
705
  interactive=True,
706
  elem_classes="centered solid imgcontainer",
707
  key="imgSketch",
708
+ image_mode="RGBA",
709
  format="PNG",
710
+ brush=gr.Brush()
 
711
  )
712
  with gr.Row():
713
  with gr.Column(scale=1):
 
909
  inputs=[input_image, composite_color, composite_opacity],
910
  outputs=[input_image]
911
  )
912
+ input_image.input(
913
+ fn=on_input_image_change,
914
+ inputs=[input_image],
915
+ outputs=[input_image,sketch_image], scroll_to_output=True,
916
+ )
917
  #use conditioned_image as the input_image for generate_input_image_click
918
  generate_input_image_from_gallery.click(
919
  fn=run_lora,
920
+ inputs=[prompt, map_options, input_image, image_strength, cfg_scale, steps, selected_index, randomize_seed, seed, width, height, lora_scale, enlarge_to_default, gr.State(True)],
921
  outputs=[input_image, seed, progress_bar], scroll_to_output=True
922
  )
923
  prerendered_image_gallery.select(
 
927
  show_api=False, scroll_to_output=True
928
  )
929
  alpha_composite_slider.change(
930
+ fn=composite_with_control_sync,
931
  inputs=[input_image, sketch_image, alpha_composite_slider],
932
  outputs=[input_image],
933
  scroll_to_output=True
 
960
  gr.on(
961
  triggers=[generate_button.click, prompt.submit],
962
  fn=run_lora,
963
+ inputs=[prompt, map_options, input_image, image_strength, cfg_scale, steps, selected_index, randomize_seed, seed, width, height, lora_scale, enlarge_to_default, gr.State(False)],
964
  outputs=[input_image, seed, progress_bar]
965
  )
966
 
modules/image_utils.py CHANGED
@@ -17,10 +17,10 @@ from modules.color_utils import (
17
  )
18
  def get_image_from_dict(image_path):
19
  if isinstance(image_path, dict) :
20
- if 'image' in image_path:
21
- image_path = image_path.get('image')
22
- elif 'composite' in image_path:
23
  image_path = image_path.get('composite')
 
 
24
  else:
25
  print("\n Unknown image dictionary.\n")
26
  raise UserWarning("Unknown image dictionary.")
 
17
  )
18
  def get_image_from_dict(image_path):
19
  if isinstance(image_path, dict) :
20
+ if 'composite' in image_path:
 
 
21
  image_path = image_path.get('composite')
22
+ elif 'image' in image_path:
23
+ image_path = image_path.get('image')
24
  else:
25
  print("\n Unknown image dictionary.\n")
26
  raise UserWarning("Unknown image dictionary.")
style_20250128.css CHANGED
@@ -20,7 +20,7 @@
20
  background-color: rgba(242, 218, 163, 0.62);
21
  }
22
 
23
- .dark .gradio-container.gradio-container-5-20-0 .contain .intro {
24
  background-color: rgba(41, 18, 5, 0.38) !important;
25
  }
26
 
 
20
  background-color: rgba(242, 218, 163, 0.62);
21
  }
22
 
23
+ .dark .gradio-container.gradio-container-5-20-1 .contain .intro {
24
  background-color: rgba(41, 18, 5, 0.38) !important;
25
  }
26