forked from ckh08045/AutoPercenty
이미지번역 개선1-텍스트 그림자,테두리추가
이미지번역 개선2-반투명배경 관련 코드 제거 상세페이지 기존이미지 삭제 코드 추가(image-resized 및 figure 클래스 포함)
This commit is contained in:
parent
063b0adbd6
commit
e657210afc
|
|
@ -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 객체 생성
|
||||
|
|
|
|||
|
|
@ -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:
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue