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 메타데이터를 체크하여 사진을 올바른 방향으로 회전시킨다.
(스마트폰이나 카메라로 찍은 사진이 자동으로 돌아가는 현상을 막기 위함)ImageDraw와ImageFont를 활용해 패턴과 텍스트를 원하는 위치에 그린다.
- 사용자의 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