OpenSource

[Python] tkinter, pyinstaller 이용해서 GUI 프로그램 제작기 (Free EXIF Remover

dev-labs 2024. 7. 29. 04:59
Blog에 이미지 업로드할 때, 이미지의 EXIF를 제거하는 프로그램을 찾았지만 모든 EXIF를 지워버려서 사진의 경우 이미지가 회전하는 불편함이 있었다. 그래서 처음엔 Python 코드를 작성했다가 결국 GUI까지 만들어버렸다. 

 

 

기본적으로 나와 있는 EXIF 제거 프로그램은 모든 Exif를 제거해버려서 불편함이 있다.

가장 많이쓰는 듯한 Exif Eraser

 

일괄로 이 프로그램에서 처리하게 되면 아래처럼 사진이 돌아가 버린다.

 

다른 프로그램을 찾아보거나 Image Viewer에 있는 기능들을 이용해보아도 이미지가 다 돌아간다.

 

이미지뷰어에 있는 메타데이터 제거 Tool

 

 

만들고자 한 기능은 아래와 같다.

 

사진(jpg)의 EXIF(메타데이터) 제거
- 단, 이미지의 회전(orientation) 데이터는 제외하고 제거한다.

지원되는 기능
파일 선택 : 여러 파일 혹은 1개 파일 선택가능
폴더 선택 : 1개 폴더 선택 가능
드래그앤 드랍 : 폴더 혹은 이미지를 GUI로 드래그앤 드랍 하면 바로 처리한다. 

 

 

Python 코드 작성

GUI 프로그램으로 만들기 위해 보통 PyQT 아니면 tkinter를 많이 사용하는데, 간단한 프로그램이므로 tkinter 라이브러리를 사용했다.

 

최대한 간단하게 만들었다.

 

이름엔 ever Free 를 붙였다. 혹시 찾는 사람이 있을까 싶어서.

 

exe 파일로 패키징

본격적인 어려움은 EXE 파일을 패키징하는 것 부터 시작했다.

 

우선 pyinstaller 라는 것을 이용하여 하나의 exe 파일로 패키징이 가능하다.

 

몇가지 복병이 있었는데

1. Python에서 사용된 library 들이 exe에 제대로 포함되지 않는 문제

2. icon (.ico) 가 들어가지 않는문제

3. exe 파일의 용량이 너무 큰 문제

초기 패키징했던 파일은 237메가 였다.

등이 었다.

 

1. Python에서 사용된 library 들이 exe에 제대로 포함되지 않는 문제

이 문제는 pyinstaller가 자동으로 설치된 라이브러리들을 가져와주지만 안되는것들은 pyinstaller 작업시에 별도로 추가해서 해결이 되었다.

pyinstaller --onefile --windowed --i=icon.ico --add-data="icon.ico;." --add-data="(경로)\anaconda3\Lib\site-packages\tkinterdnd2;tkinterdnd2" --add-data="(경로)\Python\Python38\tcl\tix8.4.3;tcl\tix8.4.3" exif.py

 

tkinter 가 잘 가져와지지 않았는데, --add-data 명령어로 해결이 되었다.

 

2. icon (.ico) 가 들어가지 않는문제

여기에 넣으려고 Chatgpt를 통해 돌려보았다

이 문제도 역시 --add-data로 해결하였고, 이렇게 -add-data로 추가한 파일은 실제 exe파일이 실행되었을때 경로를 못찾아 올수있다. 그 부분은 아래 코드로 해결하였다.

if getattr(sys, 'frozen', False):
    application_path = sys._MEIPASS
elif __file__:
    application_path = os.path.dirname(__file__)

 

 

3. exe 파일의 용량이 너무 큰 문제

pyinstaller가 exe패키징할때 현재 설치된 library를 모두 불러와서 설치하는 것이라서 우선 python3 가상환경을 만들고 필요한 library만 pip로 설치하고 진행하였더니 크게 줄어들었다. (더 줄이고싶지만 가능한지 모르겠다.)

초기 anaconda3 로 패키징 한 파일 exif_remover.exe (237MB)

 

237 MB → 12.7MB

(무려 1/20 되었다.)

 

 

 

 

Github : https://github.com/daligi/FreeExifRemover

 

GitHub - daligi/FreeExifRemover: Removes EXIF metadata while preserving image orientation. It deletes all EXIF information excep

Removes EXIF metadata while preserving image orientation. It deletes all EXIF information except for the image orientation. Developed using Python. - daligi/FreeExifRemover

github.com