1
0
Fork 0

이미지번역 개선1-텍스트 그림자,테두리추가

이미지번역 개선2-반투명배경 관련 코드 제거
상세페이지 기존이미지 삭제 코드 추가(image-resized 및 figure 클래스 포함)
This commit is contained in:
Envy_PC 2024-04-25 16:08:51 +09:00
parent 063b0adbd6
commit e657210afc
6 changed files with 61 additions and 97 deletions

View File

@ -32,9 +32,11 @@ def detail_ai(driver, textarea, aicontents, combined_value):
time.sleep(0.5)
current_value = textarea.get_attribute("data-value")
logger.debug("current_value에서 기존 이미지 삭제")
deleted_original_html_tags = original_html(current_value)
# deleted_original_html_tags = original_html(current_value)
deleted_original_html_tags = remove_resized_images(current_value)
ai_value = combined_value + aicontent_html + deleted_original_html_tags
# ai_value = combined_value + aicontent_html + current_value
# contents 변수의 값이 None이 아닐 때만 send_keys 메서드를 호출합니다.
if aicontent_html is not None:
# logger.debug("aicontent_html 입력시작")
@ -319,6 +321,24 @@ def find_delivery_fee(weight, delv_collection):
# product_info_text += f'네이버 상품의 최고 가격은 [{high_price}]'
# return product_info_text
def remove_resized_content(current_html):
# BeautifulSoup 객체 생성
soup = BeautifulSoup(current_html, 'html.parser')
# "img class='image_resized'" 태그와 "figure class='image_resized'" 태그 모두 추출
resized_elements = soup.find_all(['img', 'figure'], class_='image_resized')
# 각 요소의 src 속성을 빈 문자열로 설정하거나 요소 자체를 삭제
for element in resized_elements:
if element.name == 'img':
element['src'] = "" # 이미지 src를 비워 렌더링되지 않게 함
elif element.name == 'figure':
element.decompose() # figure 태그 자체를 문서에서 제거
# 수정된 HTML을 문자열로 변환하여 반환
modified_html = str(soup)
return modified_html
def original_html(current_html):
# BeautifulSoup 객체 생성

View File

@ -33,7 +33,7 @@ def modify_price_page(driver, product_infos):
plus_fee_xpath="//div[@id='productMainContentContainerId']/div/div/div/div/div[2]/div/div/div[8]/div/div/div[3]/div/div/div/div/div[2]/input"
plus_fee_element = return_element(driver, 'XPATH', plus_fee_xpath, 10)
plus_fee_text = plus_fee_element.text()
plus_fee_text = plus_fee_element.text
option_high_price = product_infos.option_high_price
@ -132,7 +132,7 @@ def modify_price_page(driver, product_infos):
return_fee_element.send_keys(Keys.CLEAR) # 기존 가격 삭제
driver.execute_script("arguments[0].value = '';", return_fee_element) # 기존 가격 삭제 JS
logger.debug("기존가격 삭제")
return_fee = 199,000
return_fee = 199000
return_fee_element.send_keys(return_fee) # 새 가격 입력
logger.debug(f"반품비 수정 완료 : {return_fee}")
except Exception as e:
@ -145,7 +145,7 @@ def modify_price_page(driver, product_infos):
first_delv_fee_element.send_keys(Keys.CLEAR) # 기존 가격 삭제
driver.execute_script("arguments[0].value = '';", first_delv_fee_element) # 기존 가격 삭제 JS
logger.debug("기존가격 삭제")
init_delv_fee = 199,000
init_delv_fee = 199000
first_delv_fee_element.send_keys(init_delv_fee) # 새 가격 입력
logger.debug(f"초도배송비 수정 완료 : {init_delv_fee}")
except Exception as e:

View File

@ -1,17 +0,0 @@
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import time, re, random
from edit.action_elements import click_element, return_element, click_and_confirm_tab
from edit.price_cal import calculate_margin_and_price
# from ai.compare import find_most_similar_image_by_one
import logging
# 로거 인스턴스 가져오기
logger = logging.getLogger('default_logger')
def tran_detail_image(driver, product_infos):
return None

View File

@ -12,7 +12,7 @@ from img_trans.src.translation import translate_texts_deepl
from img_trans.src.text_insertion import insert_text
from img_trans.src.mini_crop_process import resize_and_crop_image
from img_trans.src.rotate_img import flip_and_rotate_image
from img_trans.src.inpainting import inpaint_text, inpaint_text_with_deepfill # 기존 인페인팅 메서드
from img_trans.src.inpainting import inpaint_text # 기존 인페인팅 메서드
import logging
# 로거 인스턴스 가져오기
@ -75,7 +75,8 @@ def image_trans(image_url, translator, convert_type):
logger.debug(f"DEEPL 번역시작")
# translated_texts = translate_texts_deepl(texts_to_translate)
try:
translated_texts = translator.translate(texts_to_translate)
# translated_texts = translator.translate(texts_to_translate)
translated_texts = None
if not translated_texts: # 빈 리스트 체크
logger.debug(f"DEEPL 번역실패로 translatepy 시작")
translated_texts = translate_texts_translatepy(texts_to_translate)

View File

@ -7,50 +7,6 @@ import logging
# 로거 인스턴스 가져오기
logger = logging.getLogger('default_logger')
def draw_translucent_banner_with_GPT(draw, box, text, font, fill_color=(255, 255, 255, 220)):
"""텍스트 주변에 반투명 배너를 그립니다."""
try:
margin = 10 # 텍스트와 배너 사이의 여백
text_width, text_height = draw.textsize(text, font=font)
x_min, y_min, x_max, y_max = box
banner_box = [x_min - margin, y_min - margin, x_min + text_width + margin, y_min + text_height + margin]
draw.rectangle(banner_box, fill=fill_color)
except Exception as e:
logger.error(f"Error drawing translucent banner: {e}")
def draw_translucent_banner_with_gemini(draw, box, text, font, fill_color=(255, 255, 255, 220)):
"""텍스트 주변에 반투명 배너를 그립니다."""
try:
margin = 10 # 텍스트와 배너 사이의 여백
text_bbox = font.getbbox(text)
text_width = text_bbox[2] - text_bbox[0]
text_height = text_bbox[3] - text_bbox[1]
# text_metrics = font.getmetrics(text)
# text_width = text_metrics[0]
# text_height = text_metrics[1]
# text_width, text_height = font.getsize(text)
x_min, y_min, x_max, y_max = box
banner_box = [x_min - margin, y_min - margin, x_min + text_width + margin, y_min + text_height + margin]
draw.rectangle(banner_box, fill=fill_color)
except Exception as e:
logger.error(f"Error drawing translucent banner: {e}")
def get_complementary_color_ori(image, box):
"""주어진 박스 영역 내의 평균 색상의 보색을 계산합니다."""
x_min, y_min, x_max, y_max = box
cropped_image = image.crop((x_min, y_min, x_max, y_max))
np_image = np.array(cropped_image)
average_color = np_image.mean(axis=(0, 1))
# RGB에서 HSV로 변환
hsv = rgb_to_hsv(*(average_color/255))
# H 채널을 조정하여 보색 구하기 (Hue를 반전)
hsv = ((hsv[0] + 0.5) % 1.0, hsv[1], hsv[2])
# HSV에서 RGB로 다시 변환
complementary_color = hsv_to_rgb(*hsv)
return tuple(int(c * 255) for c in complementary_color)
def get_dominant_color(image, box, expand=10):
"""이미지의 주어진 영역에서 지배적인 색상을 찾습니다."""
x1, y1, x2, y2 = box
@ -91,40 +47,45 @@ def calculate_font_size(text, font_path="NotoSansKR-Bold.ttf", desired_width=Non
return font_size
def draw_text_with_border(draw, text, position, font, text_color, border_color):
def draw_text_with_border(draw, translated_text, position, font, text_color, border_color):
# 텍스트 테두리 그리기
x, y = position
shadow_offset = 2 # 테두리 굵기 설정
draw.text((x - shadow_offset, y), text, font=font, fill=border_color)
draw.text((x + shadow_offset, y), text, font=font, fill=border_color)
draw.text((x, y - shadow_offset), text, font=font, fill=border_color)
draw.text((x, y + shadow_offset), text, font=font, fill=border_color)
draw.text((x - shadow_offset, y - shadow_offset), text, font=font, fill=border_color)
draw.text((x + shadow_offset, y - shadow_offset), text, font=font, fill=border_color)
draw.text((x - shadow_offset, y + shadow_offset), text, font=font, fill=border_color)
draw.text((x + shadow_offset, y + shadow_offset), text, font=font, fill=border_color)
draw.text((x - shadow_offset, y), translated_text, font=font, fill=border_color)
draw.text((x + shadow_offset, y), translated_text, font=font, fill=border_color)
draw.text((x, y - shadow_offset), translated_text, font=font, fill=border_color)
draw.text((x, y + shadow_offset), translated_text, font=font, fill=border_color)
draw.text((x - shadow_offset, y - shadow_offset), translated_text, font=font, fill=border_color)
draw.text((x + shadow_offset, y - shadow_offset), translated_text, font=font, fill=border_color)
draw.text((x - shadow_offset, y + shadow_offset), translated_text, font=font, fill=border_color)
draw.text((x + shadow_offset, y + shadow_offset), translated_text, font=font, fill=border_color)
# 본래 텍스트 그리기
draw.text(position, text, font=font, fill=text_color)
draw.text(position, translated_text, font=font, fill=text_color)
def draw_text_with_effects(draw, text, position, font, text_color="white", border_color="black"):
# 그림자 효과
shadow_offset = (2, 2)
draw.text((position[0] + shadow_offset[0], position[1] + shadow_offset[1]), text, fill="gray", font=font)
def draw_text_with_effects(draw, translated_text, position, font, text_color="white", border_color="black"):
try:
# 그림자 효과
shadow_offset = (2, 2)
draw.text((position[0] + shadow_offset[0], position[1] + shadow_offset[1]), translated_text, fill="gray", font=font)
# 텍스트 테두리
offsets = [(-1, -1), (-1, 1), (1, -1), (1, 1), (-1, 0), (1, 0), (0, -1), (0, 1)]
for offset in offsets:
draw.text((position[0] + offset[0], position[1] + offset[1]), text, fill=border_color, font=font)
# 텍스트 테두리
offsets = [(-1, -1), (-1, 1), (1, -1), (1, 1), (-1, 0), (1, 0), (0, -1), (0, 1)]
for offset in offsets:
draw.text((position[0] + offset[0], position[1] + offset[1]), translated_text, fill=border_color, font=font)
# 본래 텍스트
draw.text(position, text, font=font, fill=text_color)
# 본래 텍스트
draw.text(position, translated_text, font=font, fill=text_color)
except Exception as e:
logger.error(f"draw_text_with_effects 메서드 중 에러발생 : {e}", exc_info=True)
def draw_translucent_background(draw, box, fill_color=(255, 255, 255, 50)):
"""텍스트 주변에 반투명 배경을 추가합니다."""
margin = 10 # 배너와 텍스트 사이의 여백
expanded_box = [box[0] - margin, box[1] - margin, box[2] + margin, box[3] + margin]
draw.rectangle(expanded_box, fill=fill_color)
try:
margin = 10 # 배너와 텍스트 사이의 여백
expanded_box = [box[0] - margin, box[1] - margin, box[2] + margin, box[3] + margin]
draw.rectangle(expanded_box, fill=fill_color)
except Exception as e:
logger.error(f"draw_translucent_background 메서드 중 에러발생 : {e}", exc_info=True)
# def insert_text(image_path, translated_texts, detected_texts):
def insert_text(inpainted_image, translated_texts, detected_texts):
@ -142,8 +103,8 @@ def insert_text(inpainted_image, translated_texts, detected_texts):
for detected_text, translated_text in zip(detected_texts, translated_texts):
box = detected_text[0] # (box, text, confidence) 형태의 detected_text에서 box를 추출
text_position = (box[0], box[1]) # 텍스트 위치 설정
# text_position = (box[0], box[1]) # 텍스트 위치 설정
text_position = (box[0][0], box[0][1])
# box 형태: [[x1, y1], [x2, y2], [x3, y3], [x4, y4]]
# 이미지 영역에서 지배적인 색상을 찾기 위해 x, y 좌표 최소값과 최대값을 사용
x_coords = [coord[0] for coord in box]
@ -152,7 +113,7 @@ def insert_text(inpainted_image, translated_texts, detected_texts):
y_min, y_max = min(y_coords), max(y_coords)
new_box = [x_min, y_min, x_max, y_max]
draw_translucent_background(draw, new_box)
# draw_translucent_background(draw, new_box)
# 수정된 부분: 올바른 x, y 좌표를 사용하여 dominant_color 계산
# dominant_color = get_dominant_color(image, (x_min, y_min, x_max, y_max))
@ -179,5 +140,5 @@ def insert_text(inpainted_image, translated_texts, detected_texts):
cv_image = cv2.cvtColor(np.array(image), cv2.COLOR_RGBA2BGR)
return cv_image
except Exception as e:
logger.error(f"Error inserting text: {e}")
logger.error(f"Error inserting text: {e}", exc_info=True)
return inpainted_image

View File

@ -14,7 +14,6 @@ from edit.options import modify_option_page
from edit.price import modify_price_page
from edit.title import modify_product_title
from edit.thumbnail import modify_thumb_page
from edit.trans_image import *
from edit.uploadMarket import *
from edit.action_elements import click_element, return_element, wait_element
import logging