콘텐츠로 건너뛰기
Home » 나만의 이미지 변환 프로그램을 직접 만들어보자!

나만의 이미지 변환 프로그램을 직접 만들어보자!

살다 보면 이미지 파일의 형식을 바꿔야 할 일이 생긴다. 사이트에 이미지를 업로드하고 싶은데 특정 형식의 이미지만 업로드 할 수 있는 경우를 본 적이 있을 것이다. 그럴 때는 이미지 변환 사이트를 이용하면 간단히 이미지 형식을 바꿀 수 있다.

보통의 경우 변환 방법은 다음과 같다.

원본파일형식 선택 > 바꿀 형식 선택 > 파일 업로드 > 변환 > 변환된 파일 다운로드

변환할 일이 자주 생기지 않고, 변환할 파일의 개수가 적다면 이런 방법으로 충분히 원하는 결과를 얻을 수 있다. 하지만 변환을 자주, 그리고 많이 해야한다면 이 글의 내용을 따라 자신만의 변환기를 만들어 보는 것도 좋을 것이다.

tkinter 설치

UI를 사용하기 위해서 파이썬 라이브러리인 tkinter를 설치해야한다. 터미널에서 아래 명령으로 설치할 수 있다. 단, pip가 설치되어있어야 한다.

pip install tkinter

필수 라이브러리 임포트

필수 라이브러리를 임포트 한다.

import os
import sys
import tkinter as tk
from tkinter import filedialog, messagebox
from PIL import Image
from datetime import datetime

UI객체 생성 및 실행

tk인터로 ui객체를 생성하고 크기 버튼 등을 설정한다. 프로그램 화면에 보이는 메뉴를 아래 코드에서 수정할 수 있다. 앱 제목이나 버튼 이름들을 직접 바꿔보자.

app = tk.Tk()
app.title('WebP 변환기')
file_list = tk.Listbox(app, selectmode=tk.EXTENDED)
file_list.pack(fill=tk.BOTH, expand=True)
button_frame = tk.Frame(app)
button_frame.pack(fill=tk.X, expand=True)
select_button = tk.Button(button_frame, text="파일 선택", command=select_files)
select_button.pack(side=tk.LEFT, fill=tk.X, expand=True)
convert_button = tk.Button(button_frame, text="파일 변환", command=convert_files)
convert_button.pack(side=tk.LEFT, fill=tk.X, expand=True)
app.mainloop()
webp 이미지 변환기
실행 시 프로그램 UI

파일 선택 함수

파일 선택 버튼을 눌렀을 때 작동하는 함수이다. 실행 시 익숙한 파일 선택창이 아래와 같이 등장한다. 필요한 확장자가 더 있다면 file_types에 추가 할 수 있다.

def select_files():
    file_types = [('Image files', '*.jpg;*.png;*.jpeg')]
    selected_files = filedialog.askopenfilenames(filetypes=file_types)
    
    if selected_files:
        file_list.delete(0, tk.END)
        for file in selected_files:
            file_list.insert(tk.END, file)
파일 선택 상자
file_types에서 지정한 형식의 파일만 보인다.
파일 선택 화면
파일 선택 후 화면

폴더 열기 함수

이미지 변환 후 저장된 폴더를 연다. 이걸 설정해놓지 않으면 매번 변환된 파일을 찾으러 돌아다녀야 한다. if조건은 윈도우 운영체제를 위한 코드이며 else조건은 리눅스나 유닉스(맥os)를 위한 코드이다.

def open_folder(folder_path):
    if sys.platform == "win32":
        os.startfile(folder_path)
    else: 
        opener = "open" if sys.platform == "darwin" else "xdg-open"
        os.system(f"{opener} {folder_path}")
생성 완료 후 폴더로 이동 팝업
폴더열기 함수 실행 시 화면

이미지 변환 함수

WepP 대신 원하는 파일 유형으로 설정 가능하다. avif 파일이 더 높은 압축률을 제공한다고 한다. 코드의 이해가 없이는 수정이 힘들 수 있지만, 코드 전문을 챗지피티에게 보내준 뒤 다른 옵션으로 바꿔달라고 하면 친절하게 코드를 작성해준다.

def convert_files():
    if not file_list.size():
        return
    now = datetime.now().strftime('%Y%m%d_%H%M%S')
    parent_path = os.path.dirname(file_list.get(0))
    output_dir = os.path.join(parent_path, f'{now}_변환된 파일')
    
    os.makedirs(output_dir, exist_ok=True)
    for i in range(file_list.size()):
        input_file = file_list.get(i)
        file_name, _ = os.path.splitext(os.path.basename(input_file))
        output_file = os.path.join(output_dir, f'{file_name}.webp')
        
        image = Image.open(input_file)
        image.save(output_file, 'WebP')
    file_list.delete(0, tk.END)
    ask_open_folder = messagebox.askyesno("완료", "생성이 완료되었습니다. 폴더를 열까요?")
    if ask_open_folder:
        open_folder(output_dir)
webp로 변환된 파일
위에서 선택한 파일들이 모두 .webp확장자로 변한 것을 확인할 수 있다.

마치며

워드프레스에 올릴 사진을 변환하기 위한 목적이라면, 플러그인을 설치하는 게 훨씬 간편하다. 나는 학생들 학습지를 이미지 파일로 배부한다. 여기서 이미지 파일 용량 관리를 해주지 않으면 학생들이 불편함을 호소하기에 이 앱 개발이 불가피했다. 과거였다면 개발시간이 오래 걸리기 때문에 이런 수고를 직접 하지는 않았을 것이다. 하지만 요즘은 다양한 언어모델에서 대부분의 코드를 작성해 준다. 마음만 먹으면 비전공자라도 많은 프로그램을 직접 만들어볼 수 있는 시대가 온 것이다. 혹시 생활에 불편함이 있다면 챗지피티의 도움을 받아 자신만의 도구를 만들어 보는 것을 추천한다.