aiqtech commited on
Commit
d256b23
·
verified ·
1 Parent(s): 8828356

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -19
app.py CHANGED
@@ -524,17 +524,17 @@ def add_text_to_image(
524
  opacity,
525
  x_position,
526
  y_position,
527
- thickness
 
528
  ):
529
  """
530
  Add text to an image with customizable properties
531
  """
532
  try:
533
- # 입력 이미지 처리 수정
534
  if input_image is None:
535
  return None
536
 
537
- # PIL Image 객체로 변환 (이미 PIL Image인 경우 그대로 사용)
538
  if not isinstance(input_image, Image.Image):
539
  if isinstance(input_image, np.ndarray):
540
  image = Image.fromarray(input_image)
@@ -547,11 +547,16 @@ def add_text_to_image(
547
  if image.mode != 'RGBA':
548
  image = image.convert('RGBA')
549
 
550
- # Create a transparent overlay for the text
 
 
 
 
 
551
  txt_overlay = Image.new('RGBA', image.size, (255, 255, 255, 0))
552
  draw = ImageDraw.Draw(txt_overlay)
553
 
554
- # Create a font with specified size
555
  try:
556
  font = ImageFont.truetype("DejaVuSans.ttf", int(font_size))
557
  except:
@@ -561,7 +566,7 @@ def add_text_to_image(
561
  print("Using default font")
562
  font = ImageFont.load_default()
563
 
564
- # Convert color name to RGB
565
  color_map = {
566
  'White': (255, 255, 255),
567
  'Black': (0, 0, 0),
@@ -573,19 +578,19 @@ def add_text_to_image(
573
  }
574
  rgb_color = color_map.get(color, (255, 255, 255))
575
 
576
- # Get text size for positioning
577
  text_bbox = draw.textbbox((0, 0), text, font=font)
578
  text_width = text_bbox[2] - text_bbox[0]
579
  text_height = text_bbox[3] - text_bbox[1]
580
 
581
- # Calculate actual positions
582
  actual_x = int((image.width - text_width) * (x_position / 100))
583
  actual_y = int((image.height - text_height) * (y_position / 100))
584
 
585
- # Create final color with opacity
586
  text_color = (*rgb_color, int(opacity))
587
 
588
- # Draw text with stroke
589
  add_text_with_stroke(
590
  draw,
591
  text,
@@ -596,17 +601,22 @@ def add_text_to_image(
596
  int(thickness)
597
  )
598
 
599
- # Combine the original image with the text overlay
600
- output_image = Image.alpha_composite(image, txt_overlay)
 
 
 
 
 
601
 
602
- # Convert back to RGB for display
603
  output_image = output_image.convert('RGB')
604
 
605
  return output_image
606
 
607
  except Exception as e:
608
  print(f"Error in add_text_to_image: {str(e)}")
609
- return input_image # 에러 발생 시 원본 이미지 반환
610
 
611
  with gr.Blocks(theme=gr.themes.Soft(), css=css) as demo:
612
  gr.HTML("""
@@ -686,10 +696,18 @@ with gr.Blocks(theme=gr.themes.Soft(), css=css) as demo:
686
  # 텍스트 삽입 컨트롤을 더 명확하게 구분
687
  with gr.Group():
688
  gr.Markdown("### Add Text to Image")
689
- text_input = gr.Textbox(
690
- label="Text Content",
691
- placeholder="Enter text to add to image..."
692
- )
 
 
 
 
 
 
 
 
693
  with gr.Row():
694
  with gr.Column(scale=1):
695
  font_size = gr.Slider(
@@ -812,7 +830,8 @@ with gr.Blocks(theme=gr.themes.Soft(), css=css) as demo:
812
  opacity_slider,
813
  x_position,
814
  y_position,
815
- thickness
 
816
  ],
817
  outputs=combined_image
818
  )
 
524
  opacity,
525
  x_position,
526
  y_position,
527
+ thickness,
528
+ text_position_type
529
  ):
530
  """
531
  Add text to an image with customizable properties
532
  """
533
  try:
 
534
  if input_image is None:
535
  return None
536
 
537
+ # PIL Image 객체로 변환
538
  if not isinstance(input_image, Image.Image):
539
  if isinstance(input_image, np.ndarray):
540
  image = Image.fromarray(input_image)
 
547
  if image.mode != 'RGBA':
548
  image = image.convert('RGBA')
549
 
550
+ # Text Behind Image 처리
551
+ if text_position_type == "Text Behind Image":
552
+ # 원본 이미지의 배경 제거
553
+ overlay_image = remove_background(image)
554
+
555
+ # 텍스트 오버레이 생성
556
  txt_overlay = Image.new('RGBA', image.size, (255, 255, 255, 0))
557
  draw = ImageDraw.Draw(txt_overlay)
558
 
559
+ # 폰트 설정
560
  try:
561
  font = ImageFont.truetype("DejaVuSans.ttf", int(font_size))
562
  except:
 
566
  print("Using default font")
567
  font = ImageFont.load_default()
568
 
569
+ # 색상 설정
570
  color_map = {
571
  'White': (255, 255, 255),
572
  'Black': (0, 0, 0),
 
578
  }
579
  rgb_color = color_map.get(color, (255, 255, 255))
580
 
581
+ # 텍스트 크기 계산
582
  text_bbox = draw.textbbox((0, 0), text, font=font)
583
  text_width = text_bbox[2] - text_bbox[0]
584
  text_height = text_bbox[3] - text_bbox[1]
585
 
586
+ # 위치 계산
587
  actual_x = int((image.width - text_width) * (x_position / 100))
588
  actual_y = int((image.height - text_height) * (y_position / 100))
589
 
590
+ # 텍스트 색상 설정
591
  text_color = (*rgb_color, int(opacity))
592
 
593
+ # 텍스트 그리기
594
  add_text_with_stroke(
595
  draw,
596
  text,
 
601
  int(thickness)
602
  )
603
 
604
+ if text_position_type == "Text Behind Image":
605
+ # 텍스트를 먼저 그리고 그 위에 이미지 오버레이
606
+ output_image = Image.alpha_composite(image, txt_overlay)
607
+ output_image = superimpose(output_image, overlay_image)
608
+ else:
609
+ # 기존 방식대로 텍스트를 이미지 위에 그리기
610
+ output_image = Image.alpha_composite(image, txt_overlay)
611
 
612
+ # RGB 변환
613
  output_image = output_image.convert('RGB')
614
 
615
  return output_image
616
 
617
  except Exception as e:
618
  print(f"Error in add_text_to_image: {str(e)}")
619
+ return input_image
620
 
621
  with gr.Blocks(theme=gr.themes.Soft(), css=css) as demo:
622
  gr.HTML("""
 
696
  # 텍스트 삽입 컨트롤을 더 명확하게 구분
697
  with gr.Group():
698
  gr.Markdown("### Add Text to Image")
699
+ with gr.Row():
700
+ text_input = gr.Textbox(
701
+ label="Text Content",
702
+ placeholder="Enter text to add to image..."
703
+ )
704
+ text_position_type = gr.Radio(
705
+ choices=["Text Over Image", "Text Behind Image"],
706
+ value="Text Over Image",
707
+ label="Text Position Type",
708
+ interactive=True
709
+ )
710
+
711
  with gr.Row():
712
  with gr.Column(scale=1):
713
  font_size = gr.Slider(
 
830
  opacity_slider,
831
  x_position,
832
  y_position,
833
+ thickness,
834
+ text_position_type
835
  ],
836
  outputs=combined_image
837
  )