이미지 크롭

이미지 크기 필터링(200px)
슬립모드 방지
다음페이지 css 수정
This commit is contained in:
R5600U_PC 2024-09-24 23:51:38 +09:00
parent 738969dfd4
commit 77d08b11e8
4 changed files with 15370 additions and 9 deletions

File diff suppressed because it is too large Load Diff

View File

@ -23,10 +23,34 @@ class base64TOImage:
self.logger.debug(f"클립보드 데이터를 가져오는 중 오류 발생: {e}") self.logger.debug(f"클립보드 데이터를 가져오는 중 오류 발생: {e}")
return None return None
# def set_image_to_clipboard(self, image):
# """이미지를 클립보드에 넣는 함수 (Windows 전용)"""
# output = BytesIO()
# image.save(output, "BMP")
# data = output.getvalue()[14:] # BMP 헤더 제거
# output.close()
# # 클립보드에 이미지 데이터 넣기
# win32clipboard.OpenClipboard()
# win32clipboard.EmptyClipboard()
# win32clipboard.SetClipboardData(win32clipboard.CF_DIB, data)
# win32clipboard.CloseClipboard()
def set_image_to_clipboard(self, image): def set_image_to_clipboard(self, image):
"""이미지를 클립보드에 넣는 함수 (Windows 전용)""" """이미지를 클립보드에 넣는 함수 (Windows 전용, 5% 크롭 후)"""
# 이미지의 크기 계산 (5% 크롭)
width, height = image.size
left = width * 0.05
top = height * 0.05
right = width * 0.95
bottom = height * 0.95
# 5% 크롭 적용
cropped_image = image.crop((left, top, right, bottom))
# 이미지를 BMP 형식으로 변환하여 클립보드에 넣기
output = BytesIO() output = BytesIO()
image.save(output, "BMP") cropped_image.save(output, "BMP")
data = output.getvalue()[14:] # BMP 헤더 제거 data = output.getvalue()[14:] # BMP 헤더 제거
output.close() output.close()
@ -36,6 +60,9 @@ class base64TOImage:
win32clipboard.SetClipboardData(win32clipboard.CF_DIB, data) win32clipboard.SetClipboardData(win32clipboard.CF_DIB, data)
win32clipboard.CloseClipboard() win32clipboard.CloseClipboard()
self.logger.debug("5% 크롭된 이미지가 클립보드에 저장되었습니다.")
def base64_to_image(self, base64_data): def base64_to_image(self, base64_data):
"""Base64 데이터를 이미지로 변환하는 함수""" """Base64 데이터를 이미지로 변환하는 함수"""
if base64_data.startswith('data:image'): if base64_data.startswith('data:image'):
@ -91,6 +118,35 @@ class base64TOImage:
self.logger.debug("이미지 다운로드 최대 재시도 횟수를 초과했습니다.") self.logger.debug("이미지 다운로드 최대 재시도 횟수를 초과했습니다.")
return None return None
# def process_clipboard(self, original_url):
# """클립보드의 내용을 처리하고, 필요한 경우 이미지 변환 또는 URL 이미지 복사"""
# clipboard_data = self.get_clipboard_data()
# if clipboard_data.startswith('data:image'):
# # 클립보드에 있는 Base64 데이터를 이미지로 변환
# image = self.base64_to_image(clipboard_data)
# if image:
# self.logger.debug("Base64 이미지 변환 성공, 클립보드에 다시 저장 중...")
# self.set_image_to_clipboard(image)
# self.logger.debug("이미지가 클립보드에 저장되었습니다.")
# else:
# self.logger.debug("Base64 이미지 변환 실패.")
# elif clipboard_data.strip() == "html > whale-ocr":
# # 'html > whale-ocr' 감지 시 원본 이미지 URL에서 이미지를 다운로드하여 클립보드에 복사
# if original_url:
# image = self.download_image_from_url(original_url)
# if image:
# self.logger.debug("원본 이미지 다운로드 성공, 클립보드에 다시 저장 중...")
# self.set_image_to_clipboard(image)
# self.logger.debug("원본 이미지가 클립보드에 저장되었습니다.")
# else:
# self.logger.debug("원본 이미지 다운로드 실패.")
# else:
# self.logger.debug("원본 이미지 URL을 찾을 수 없습니다.")
# else:
# self.logger.debug("클립보드에 Base64 이미지나 'html > whale-ocr' 데이터가 없습니다.")
def process_clipboard(self, original_url): def process_clipboard(self, original_url):
"""클립보드의 내용을 처리하고, 필요한 경우 이미지 변환 또는 URL 이미지 복사""" """클립보드의 내용을 처리하고, 필요한 경우 이미지 변환 또는 URL 이미지 복사"""
clipboard_data = self.get_clipboard_data() clipboard_data = self.get_clipboard_data()
@ -117,5 +173,30 @@ class base64TOImage:
self.logger.debug("원본 이미지 다운로드 실패.") self.logger.debug("원본 이미지 다운로드 실패.")
else: else:
self.logger.debug("원본 이미지 URL을 찾을 수 없습니다.") self.logger.debug("원본 이미지 URL을 찾을 수 없습니다.")
elif clipboard_data:
# 클립보드 내용이 이미지인 경우, 이미지 크기를 검사
image = self.base64_to_image(clipboard_data)
if image:
width, height = image.size
self.logger.debug(f"클립보드에 있는 이미지 크기: {width}x{height}")
# 이미지가 가로나 세로 중 하나라도 200픽셀 이하인 경우 원본 이미지 다운로드
if width <= 200 or height <= 200:
if original_url:
self.logger.debug(f"이미지 크기가 {width}x{height}로 200픽셀 이하입니다. 원본 이미지 다운로드 중...")
original_image = self.download_image_from_url(original_url)
if original_image:
self.logger.debug("원본 이미지 다운로드 성공, 클립보드에 다시 저장 중...")
self.set_image_to_clipboard(original_image)
self.logger.debug("원본 이미지가 클립보드에 저장되었습니다.")
else:
self.logger.debug("원본 이미지 다운로드 실패.")
else:
self.logger.debug("원본 이미지 URL을 찾을 수 없습니다.")
else:
self.logger.debug("이미지 크기가 200픽셀 이상입니다. 처리할 필요가 없습니다.")
else:
self.logger.debug("클립보드에 있는 데이터는 이미지가 아닙니다.")
else: else:
self.logger.debug("클립보드에 Base64 이미지나 'html > whale-ocr' 데이터가 없습니다.") self.logger.debug("클립보드에 Base64 이미지나 'html > whale-ocr' 데이터가 없습니다.")

View File

@ -327,7 +327,7 @@ class BrowserController:
self.switch_to_chrome() # 크롬으로 포커스 이동 self.switch_to_chrome() # 크롬으로 포커스 이동
base64toimage.process_clipboard(url) # 클립보드 내용이 base64일 경우 이미지로 변환 base64toimage.process_clipboard(url) # 클립보드 내용이 base64일 경우 이미지로 변환
pyautogui.hotkey('ctrl', 'v') # 클립보드 이미지 붙여넣기 pyautogui.hotkey('ctrl', 'v') # 클립보드 이미지 붙여넣기
pyautogui.press('enter') # 엔터 키 입력 pyautogui.press('right') # 오른쪽 입력
self.logger.debug("이미지 붙여넣기 완료.") self.logger.debug("이미지 붙여넣기 완료.")
except Exception as e: except Exception as e:
self.logger.debug(f"이미지 붙여넣기 중 오류: {str(e)}") self.logger.debug(f"이미지 붙여넣기 중 오류: {str(e)}")
@ -344,7 +344,8 @@ class BrowserController:
def go_to_next_page(self): def go_to_next_page(self):
"""다음 페이지로 이동""" """다음 페이지로 이동"""
try: try:
next_button = self.page.query_selector('li.ant-pagination-item-next') next_button = self.page.query_selector('li.ant-pagination-next button.ant-pagination-item-link')
if next_button: if next_button:
next_button.click() next_button.click()
self.page.wait_for_load_state('domcontentloaded') self.page.wait_for_load_state('domcontentloaded')

30
main.py
View File

@ -1,16 +1,36 @@
import ctypes
from PyQt5.QtWidgets import QApplication from PyQt5.QtWidgets import QApplication
from gui import TranslationApp from gui import TranslationApp
from logger_module import setup_logger from logger_module import setup_logger
# 절전모드를 방지하는 설정 값
ES_CONTINUOUS = 0x80000000
ES_SYSTEM_REQUIRED = 0x00000001
def prevent_sleep():
"""절전모드 방지를 위해 시스템 설정을 변경"""
ctypes.windll.kernel32.SetThreadExecutionState(ES_CONTINUOUS | ES_SYSTEM_REQUIRED)
def allow_sleep():
"""절전모드 방지 설정을 해제"""
ctypes.windll.kernel32.SetThreadExecutionState(ES_CONTINUOUS)
def main(): def main():
# 로깅 설정 # 로깅 설정
logger = setup_logger('default_logger', f'appTranslator.log') logger = setup_logger('default_logger', f'appTranslator.log')
# PyQt5 앱 실행 # 절전모드 방지 활성화
app = QApplication([]) prevent_sleep()
window = TranslationApp(logger) # 로거를 TranslationApp에 전달
window.show() try:
app.exec_() # PyQt5 앱 실행
app = QApplication([])
window = TranslationApp(logger) # 로거를 TranslationApp에 전달
window.show()
app.exec_()
finally:
# 앱 종료 시 절전모드 방지 해제
allow_sleep()
if __name__ == '__main__': if __name__ == '__main__':
main() main()