import cv2 from io import BytesIO import base64 from PIL import Image import urllib, requests import numpy as np import time import random from img_trans.src.text_detection_with_paddle import detect_text from img_trans.src.removal import process_image_based_on_text_area from img_trans.src.translation import translate_texts_translatepy 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 # 기존 인페인팅 메서드 # import logging # 로거 인스턴스 가져오기 # logger = logging.getLogger('default_logger') def image_trans(image_url, translator, convert_type, logger): # 이미지를 URL로부터 읽어옵니다. try: # image = read_image_from_url(image_url) image = read_image_from_url_with_requests(image_url) except Exception as e: logger.error(f"image_url 처리 중 에러발생 : {e}") if image is None: return None # 이미지 로드에 실패한 경우, 추가 처리를 중단하고 None을 반환 try: logger.debug(f"이미지 타입 : {type(image)}") # 이미지에서 텍스트 인식 detected_texts = detect_text(image) if not detected_texts: logger.debug("텍스트가 없는 이미지") pil_img = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB)) return pil_img # logger.debug("Detected texts:", detected_texts) logger.debug("Detected texts: %s", detected_texts) # 처리된 이미지 경로 설정 img_name = "output" thumb_image_path = f'img/{img_name}_thumbnail.jpg' translated_image_path = f'img/{img_name}_translated.jpg' # 처리된 이미지 경로 설정 Thumb_image_path = f'img/{img_name}_Thumb.jpg' processed_image_path = f'img/{img_name}_processed.jpg' translated_image_path = f'img/{img_name}_translated.jpg' inpainted_image_path = f'img/{img_name}_inpainted.jpg' if convert_type == 'thumbnail': # 썸네일 생성 로직 logger.debug("썸네일 생성 처리 시작") # 크롭과 인페인팅 결정 및 처리 함수 호출 removal_img = process_image_based_on_text_area(image, detected_texts, processed_image_path, threshold = 0.1) # 추가 처리: 이미지 회전 및 좌우 반전 removal_img = flip_and_rotate_image(removal_img) cv2.imwrite(Thumb_image_path, removal_img) logger.debug(f"썸네일 이미지 생성완료: {Thumb_image_path}") # 저장된 이미지 파일의 경로를 반환합니다. return Thumb_image_path elif convert_type == 'translate': # 2단계: 인페이팅 기법으로 텍스트 제거 inpainted_image = inpaint_text(image, detected_texts, logger) # cv2.imwrite(inpainted_image_path, inpainted_image) # 이미지 번역 처리 logger.debug("이미지 번역 처리 시작") # 번역된 텍스트 추출 및 삽입 texts_to_translate = [text for _, text, _, _, _ in detected_texts] logger.debug(f"원본 텍스트: {texts_to_translate}") logger.debug(f"DEEPL 번역시작") # translated_texts = translate_texts_deepl(texts_to_translate, logger) try: translated_texts = translator.translate(texts_to_translate, logger) # translated_texts = None if not translated_texts or translated_texts == texts_to_translate: # 빈 리스트 체크 logger.debug(f"DEEPL 번역실패로 translatepy 시작") translated_texts = translate_texts_translatepy(texts_to_translate, logger) except Exception as e: translated_texts = translate_texts_translatepy(texts_to_translate, logger) logger.debug(f"번역 텍스트: {texts_to_translate}") # translated_image = insert_text(inpainted_image_path, translated_texts, detected_texts) translated_image = insert_text(inpainted_image, translated_texts, detected_texts, logger) # cv2.imwrite(translated_image_path, translated_image) logger.debug(f"번역된 이미지 생성완료 : {translated_image_path}") # 번역된 이미지 변환합니다. pil_img = Image.fromarray(cv2.cvtColor(translated_image, cv2.COLOR_BGR2RGB)) # buffered = BytesIO() # pil_img.save(buffered, format="JPEG") return pil_img except Exception as e: logger.error(f"img_trans 이미지 변역 중 에러발생 : {e}") logger.error("원래 이미지 반환") return image def read_image_from_url(image_url): if not image_url: # URL이 비어있는지 확인 logger.error("빈 URL이 제공되었습니다.") return None try: resp = urllib.request.urlopen(image_url) image = np.asarray(bytearray(resp.read()), dtype="uint8") image = cv2.imdecode(image, cv2.IMREAD_COLOR) return image except Exception as e: logger.error(f"이미지 로딩 중 오류 발생: {e}") return None def read_image_from_url_with_requests_ori(image_url): if not image_url: # URL이 비어있는지 확인 logger.error("빈 URL이 제공되었습니다.") return None headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "Accept-Language": "en-US,en;q=0.9", "Accept-Encoding": "gzip, deflate, br", "DNT": "1", # Do Not Track 요청 헤더 "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", # https로의 업그레이드를 요청 "Cache-Control": "max-age=0" # 캐시된 콘텐츠를 재사용하지 않도록 요청 } try: response = requests.get(image_url, headers=headers) image = np.asarray(bytearray(response.content), dtype="uint8") image = cv2.imdecode(image, cv2.IMREAD_COLOR) return image except Exception as e: logger.error(f"이미지 로딩 중 오류 발생: {e}") return None def read_image_from_url_with_requests(image_url, max_retries=3): if not image_url: # URL이 비어있는지 확인 logger.error("빈 URL이 제공되었습니다.") return None headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9", "Accept-Language": "en-US,en;q=0.9", "Accept-Encoding": "gzip, deflate, br", "DNT": "1", # Do Not Track 요청 헤더 "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1", "Cache-Control": "max-age=0" } retries = 0 while retries < max_retries: try: response = requests.get(image_url, headers=headers) if response.status_code == 200: image = np.asarray(bytearray(response.content), dtype="uint8") image = cv2.imdecode(image, cv2.IMREAD_COLOR) return image else: # 응답 코드가 200이 아닐 때 로그를 남기고 재시도 logger.error(f"이미지 url 로딩 실패, HTTP 상태 코드: {response.status_code}. 재시도 {retries+1}/{max_retries} : 대상URL : {image_url}") retries += 1 time.sleep(random.randint(2, 5)) # 5초에서 10초 사이의 랜덤한 시간 동안 대기 except Exception as e: logger.error(f"이미지 로딩 중 오류 발생: {e}") retries += 1 time.sleep(random.randint(2, 5)) # 예외 발생 시 랜덤 대기 후 재시도 logger.error("최대 재시도 횟수 초과") return None # 외부에서 함수를 사용하는 예 # 이미지 URL과 원하는 변환 유형('thumbnail' 또는 'translate')을 인자로 넘깁니다. # result = image_trans('http://example.com/image.jpg', 'thumbnail')