python-numpy-image-manipulation / gui.py
gui.py
Raw
from py_image_manipulation.effect import pix_to_image, image_to_pix
import py_image_manipulation.transformations  # noqa: F401
from py_image_manipulation.util import get_filters, apply_filter
import PySimpleGUI as sg  # type: ignore
import PIL.Image  # type: ignore
import io


image_files = (
    ("Image files", "*.jpeg"),
    ("Image files", "*.jpg"),
    ("Image files", "*.png"),
    ("Image files", "*.gif"),
)


if __name__ == "__main__":
    sg.theme("DarkAmber")

    layout = [
        [sg.Text("Image Output", justification="center")],
        [sg.Image(size=(400, 400), key="image")],
        [sg.Text("Select Transformation:")],
        [
            sg.Listbox(
                list(get_filters().keys()),
                size=(20, 4),
                default_values=["NoEffect"],
                key="filter",
            )
        ],
        [sg.Text("Input Image Filename:")],
        [
            sg.Input(default_text="test_images/11.jpg", key="input"),
            sg.FileBrowse(file_types=image_files),
            sg.Button("Run"),
        ],
        [sg.Text("", size=(50, 3), text_color="red", key="error")],
    ]

    window = sg.Window("Image Manipulation", layout)

    while True:
        event, values = window.read()

        if event == sg.WIN_CLOSED:  # if user closes window or clicks cancel
            break
        bio = io.BytesIO()

        try:
            img = PIL.Image.open(values["input"])
            window["error"].update("")
        except FileNotFoundError:
            window["error"].update("File does not exist")
            continue

        img.thumbnail((400, 400))

        try:
            filtered = apply_filter(values["filter"][0], image_to_pix(img))
            pix_to_image(filtered).save(bio, format="PNG")
        except Exception as e:
            window["error"].update("Error updating image: " + str(e))
            continue

        window["image"].update(data=bio.getvalue())