Note: The file is large, so Google Drive may display a warning before download. This is normal.


Intro

원하는 이미지에 워터마크를 추가하는 데스크톱 응용프로그램이다. Tkinter 모듈로 그래픽 유저 인터페이스(GUI)를 생성했다. 이미지에 전체적으로 패턴을 오버레이하거나 텍스트를 추가할 수 있으며 텍스트의 크기, 색상, 투명도, 위치를 조정할 수 있다. 또 첫 번째 이미지에 워터마크를 넣으면 다른 이미지들에도 일괄 적용되며, 각 사진의 크기에 따라 워터마크 텍스트의 크기도 자동으로 조정되도록 설정했다.


Design

  • GUI 인터페이스
    • 사용자가 직접 이미지를 불러올 수 있고, 첫 번째 이미지는 대표로 썸네일에 표시되어 변화를 바로 확인할 수 있다.
    • 텍스트 또는 패턴을 선택하여 이미지에 추가할 수 있다.
      • 텍스트는 문구, 크기, 투명도, 색상, 위치 옵션이 있다.
      • 패턴은 사선, 가로선, 세로선, 점 무늬 옵션이 있고 투명도와 색상은 텍스트의 설정과 동일하다.
    • 원본 크기의 워터마크 적용 이미지를 별도 창에서 확인 가능하며, 창 크기보다 클 경우 가로 및 세로로 스크롤할 수 있다.
    • 워터마크 적용 후 저장 시 이미지의 원래 이름 뒤에 “_watermark”가 붙어서 저장된다.
  • 일괄 처리
    • 첫 번째 이미지에 적용한 워터마크를 여러 개의 이미지에 일괄 적용하여 저장할 수 있다.
    • 워터마크 텍스트의 크기는 각 이미지의 크기에 따라 자동으로 적절히 조정된다.


Implementation

Tech Stack

  • Programming Language: Python
  • Graphics Library: Tkinter
  • Packaging: PyInstaller

Coding

  • Tkinter로 GUI 구현 및 이미지 파일 열기/저장
    • PNG, JPG, JPEG, BMP 확장자를 지원한다.
    • 처리된 이미지들은 사용자가 지정한 폴더에 저장한다.
  • PILLOW 라이브러리를 활용한 워터마킹
    • Image를 사용해 이미지를 프로그램으로 불러온다.
    • 투명도 값이 추가된 RGBA 모드로 사진을 변경한다.
    • getexif()로 이미지 파일에 포함된 EXIF 메타데이터를 체크하여 사진을 올바른 방향으로 회전시킨다.
      (스마트폰이나 카메라로 찍은 사진이 자동으로 돌아가는 현상을 막기 위함)
    • ImageDrawImageFont를 활용해 패턴과 텍스트를 원하는 위치에 그린다.
  • 사용자의 OS에 맞는 한글 폰트를 설정하여 한글 워터마크 지원
  • 같은 스타일의 워터마크를 여러 이미지에 일괄 적용
    • 워터마크 텍스트 크기는 이미지마다 자동으로 변경된다.
      • 첫 번째 이미지의 크기와 텍스트의 크기를 기준으로 비율을 설정하고 저장
      • 두 번째 이미지부터는 해당 이미지의 크기와 미리 설정된 비율에 따라 텍스트의 크기 자동 조정
      • 가로 또는 세로가 극단적으로 더 긴 이미지에 대비해 가로 길이 또는 세로 길이 중 적절한 것을 택해서 비율 계산
    • 반복문으로 불러온 모든 이미지에 워터마크를 적용하고 저장한다.
  • 사용자 편의
    • tkinter의 canvas에 첫 번째 사진을 축소해서 넣어서 이미지에 어떻게 워터마크가 적용되는지 바로 확인할 수 있다.
    • 간단한 문구를 통해 이미지 열기/저장이 제대로 되는지 파악할 수 있다.

배포

PyInstaller 모듈을 통해 프로그램을 실행 파일 형태로 변환했다. Python이나 필수 라이브러리가 설치되지 않은 컴퓨터에서도 프로그램을 실행 가능하다는 장점이 있기 때문에 시도해보았다.
다만 Mac OS 이용자만 실행 파일을 사용할 수 있고, Windows 등 다른 OS 사용자는 여전히 Python과 Pillow 라이브러리를 설치 후 파이썬 파일을 직접 실행해야 한다.


Result




Future Improvements

  • 원하는 이미지를 워터마크로 사용할 수 있는 기능 추가
  • 워터마크 텍스트에 테두리를 추가하는 옵션 넣기


Conclusion

많은 개체들을 원하는 위치에 어긋나는 것 없이 깔끔하게 배치하는 것이 쉽지 않았다. 또 한글 깨짐 현상, EXIF 메타데이터, RGBA 모드, 워터마크 텍스트의 위치 좌표 계산 및 크기 조절 등 신경써야 할 부분이 너무 많아서 완성하기까지 시간이 아주 오래 걸렸다.
또 실행 파일로 만들어서 배포하는 것도 처음 시도했는데, 코드에서 변경해야 할 부분이 많았다. 파일 경로를 모두 절대 경로로 바꿔야했고, 원본 이미지를 보여주기 위해 사용한 PILLOW 라이브러리의 show() 때문에 프로그램이 다시 열리는 문제가 생겨서 tkinter로 새 창을 여는 것으로 대신했다. 하지만 이번 기회를 계기로 GUI 프로그램 제작에 좀 더 익숙해질 수 있었다.


reference

Tkinter 구현1: https://www.youtube.com/watch?v=dcLcIa-qR8c
Tkinter 구현2: https://www.youtube.com/watch?v=x6fHhNvcGjg

Posted on: February 15, 2025