[PYTHON] Créer une visionneuse de traitement d'image avec PySimpleGUI

Voici ce que vous pouvez lire cet article:

image.png

--Viewer pour sélectionner et afficher des images --Passez les paramètres pour le traitement d'image --Afficher l'image traitée

Pour une explication de base de PySimPleGUI, reportez-vous à Si vous utilisez Tkinter, essayez d'utiliser PySimpleGUI.

Environnement de vérification

Déclencheur

image.png

J'ai vu l'article Générer automatiquement l'art ASCII qui a fait l'image ci-dessus, et il était intéressant de la déplacer. Cependant, comme la taille de l'image et les caractères à poser étaient fixes, j'ai ajouté une interface utilisateur à cette partie. L'algorithme de conversion lui-même est emprunté à l'article original. Le fichier asci_art_transform.py est applicable. L'affichage de l'image lui-même est basé sur le [Demo_Img_Viewer] officiel (https://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_Img_Viewer.py). Le fichier 08_asci_Img_.py est applicable.

Où mettre le code

Il est situé sur github https://github.com/okajun35/for_pycon_shizu/tree/master/example/08_asci_art

#!/usr/bin/env python
import PySimpleGUI as sg
from PIL import Image, ImageTk
import io
import os

import asci_art_transform as asci

"""
URL de référence; https://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_Img_Viewer.py
"""

def get_img_data(f, maxsize=(600, 450), first=False):
    """Generate image data using PIL
    """
    print("open file:", f)
    img = Image.open(f)
    img.thumbnail(maxsize)
    if first:  # tkinter is inactive the first time
        bio = io.BytesIO()
        img.save(bio, format="PNG")
        del img
        return bio.getvalue()
    return ImageTk.PhotoImage(img)


filename = './model.jpg'  #Premier fichier
asci_image = "./test.png "

image_elem = sg.Image(data=get_img_data(filename, first=True))
filename_display_elem = sg.Text(filename, size=(80, 3))

#Il n'est pas nécessaire de convertir en asc au moment de l'affichage initial
# './model.jpg'Peut être en colère
# asci_image = tranfa_asci('./model.jpg', './test.png', 16)

asc_image_elem = sg.Image(data=get_img_data(asci_image, first=True))

# define layout, show and read the form
col = [image_elem, asc_image_elem]

col_read_file = [sg.InputText('Sélectionnez les fichiers', key='-INPUT-TEXT-', enable_events=True, ),
                 sg.FileBrowse('Lisez le dossier', key='-FILE-',
                               file_types=(('fichier jpeg', '*.jpg'), ('png', '*.png'),)),
                 sg.Button('conversion')]

layout = [col_read_file,
         [sg.Slider(range=(1,64),
          key='-FONT-SIZE-',
          default_value=16,
         orientation='h',
         )], col]

window = sg.Window('Convertissons-le en art ASCII', layout, return_keyboard_events=True,
                   location=(0, 0), use_default_focus=False)

# loop reading the user input and displaying image, filename
i = 0
while True:
    # read the form
    event, values = window.read()
    print(event, values)
    # perform button and keyboard operations
    if event is None:
        break
    elif event == 'conversion':
        print(values['-INPUT-TEXT-'])
        if os.path.isfile(values['-INPUT-TEXT-']):
            #Doit être dans un fil distinct pour animer
            sg.popup_animated(sg.DEFAULT_BASE64_LOADING_GIF, message='Fonctionnement',text_color='black', background_color='white', time_between_frames=100)
            asci_image = asci.tranfa_asci(values['-INPUT-TEXT-'], asci_image, int(values['-FONT-SIZE-']))
            sg.popup_animated(image_source=None)
            print('Fin de la conversion')
            asc_image_elem.update(data=get_img_data(asci_image, first=True))
        else:
            error_massage = values['-INPUT-TEXT-'] + 'N'existe pas'
            sg.popup('Erreur', error_massage)

        
    elif values['-FILE-'] != '':
        print('FilesBrowse')
        if os.path.isfile(values['-INPUT-TEXT-']):
            image_elem.update(data=get_img_data(values['-INPUT-TEXT-'], first=True))


À propos du traitement

La procédure est la suivante.

  1. Ouvrez la boîte de dialogue de fichier et chargez le fichier que vous souhaitez convertir
  2. Sélectionnez la taille de la police à convertir
  3. Enregistrez l'image convertie au format ASCII
  4. Chargez l'image convertie et affichez-la sur l'écran des résultats

Ouvrez la boîte de dialogue de fichier et chargez le fichier que vous souhaitez convertir

sg.InputText('Sélectionnez les fichiers', key='-INPUT-TEXT-', enable_events=True, ),
sg.FileBrowse('Lisez le dossier', key='-FILE-',  file_types=(('fichier jpeg', '*.jpg'), ('png', '*.png'),)

La mise en page du dossier de diagnostic.

L'image initiale s'affiche au démarrage comme suit.

image_elem = sg.Image(data=get_img_data(filename, first=True))

filename contient un fichier image fixe. --Référence: Officiel Description de l'élément d'image

J'utilise get_img_data () pour afficher l'image. Cette méthode utilise la même fonction que celle utilisée dans le [Demo_Img_Viewer] officiel (https://github.com/PySimpleGUI/PySimpleGUI/blob/master/DemoPrograms/Demo_Img_Viewer.py).

def get_img_data(f, maxsize=(600, 450), first=False):
    """Generate image data using PIL
    """
    print("open file:", f)
    img = Image.open(f)
    img.thumbnail(maxsize)
    if first:  # tkinter is inactive the first time
        bio = io.BytesIO()
        img.save(bio, format="PNG")
        del img
        return bio.getvalue()
    return ImageTk.PhotoImage(img)

Le fichier correspondant est ouvert à l'aide de l'oreiller, et celui enregistré au format png s'affiche à l'aide de l''Image Tk 'd'oreiller. --Référence: [Description du module ImageTk] de la référence officielle de l'oreiller (https://pillow.readthedocs.io/en/4.2.x/reference/ImageTk.html)

PySimpleGUI est un wrapper pour tkinter, donc je pense que l'une de ses forces est que vous pouvez utiliser d'autres bibliothèques créées comme tkinter.

La partie suivante affiche en fait le fichier lu.

image_elem.update(data=get_img_data(values['-INPUT-TEXT-'], first=True))

Le fichier lu est spécifié. Ici, nous utilisons ʻupdate () `pour mettre à jour l'affichage.

2. Sélectionnez la taille de la police à convertir

Définissez la taille de la police à convertir avec le curseur

sg.Slider(range=(1,64),
          key='-FONT-SIZE-',
          default_value=16,
         orientation='h',
         )

Vous pouvez obtenir la valeur du curseur ci-dessous.

event, values = window.read()
values['-INPUT-TEXT-']

3. Enregistrez l'image convertie au format ASCII

Le fichier est lu et envoyé dans le fichier converti "test.png ".

asci_image = asci.tranfa_asci(values['-INPUT-TEXT-'], "asci_image", int(values['-FONT-SIZE-']))

4. Chargez l'image convertie et affichez-la sur l'écran des résultats

Le fichier d'image d'art ASCII "test.png " sera affiché.

asc_image_elem.update(data=get_img_data(asci_image, first=True))

Résumé

Avec PySimpleGUI, vous pouvez facilement créer une visionneuse de traitement d'image qui lit une image, ajoute des paramètres et la convertit. Dans la [Démo] officielle (https://github.com/PySimpleGUI/PySimpleGUI/tree/master/DemoPrograms), il y a des exemples utilisant OpenCV autre que l'oreiller. Il existe également un exemple de programme qui utilise la planification journalière pour colorer les images en noir et blanc.

Recommended Posts

Créer une visionneuse de traitement d'image avec PySimpleGUI
Créer une visionneuse d'images avec Tkinter
Traitement d'image avec MyHDL
Traitement d'image avec Python
Traitement d'image avec PIL
Créez une application de composition d'images avec Flask + Pillow
Créer une image avec des caractères avec python (japonais)
Traitement d'image avec Python (partie 2)
Traitement d'image avec PIL (Pillow)
Créer un environnement avec virtualenv
Créer une API avec Django
Traitement d'image avec Python (partie 1)
Traitement d'image avec Python (3)
[Python] Traitement d'image avec scicit-image
Découpez une image avec python
Traitement d'image avec la binarisation Python 100 knocks # 3
Créez une tranche d'âge avec les pandas
100 traitement d'image par Python Knock # 2 Échelle de gris
Essayez de créer un visualiseur de différence de chemin d'exécution avec angr + bingraphvis
[Python] J'ai créé une visionneuse d'images avec une fonction de tri simple.
Bases du traitement d'images binarisées par Python
Traitement d'image par Python 100 knock # 10 filtre médian
Créer une application de fractionnement d'image avec Tkinter
Créez une image factice avec Python + PIL.
100 traitement d'image avec Python Knock # 8 Max Pooling
Créez rapidement un fichier Excel avec Python #python
Traitement d'image avec Python et OpenCV [Tone Curve]
Traitement d'image par Python 100 knock # 12 motion filter
Créer un écran de mise à jour avec Django Updateview
[Python] Créez rapidement une API avec Flask
Dessin avec Matrix-Reinventor of Python Image Processing-
Traitez facilement des images en Python avec Pillow
Générer une instance Excel compatible avec les compléments avec xlwings
[Golang] Créer une image de menu fixe avec des actions Github
Créez une application de mots anglais avec python
Traitement d'image avec Python 100 knocks # 7 pooling moyen
Essayez de générer une image avec aliénation
Traitement d'image léger avec Python x OpenCV
Traitement d'image avec Lambda + OpenCV (création d'image grise)
Traitement d'image par Python 100 knock # 9 Filtre Gaussien
Créez un fichier msi évolutif avec cx_Freeze
[Traitement d'image] Postérisation
XavierNX accélère le traitement d'image OpenCV avec GPU (CUDA)
traitement d'image python
Créez une application qui devine les étudiants avec Python
Créer un papier peint à pois avec la bibliothèque d'images Python
Traitement d'image à partir de zéro avec python (5) Transformation de Fourier
Comment recadrer une image avec Python + OpenCV
Traitement d'image à partir de zéro avec python (4) Extraction de contour
Traitement d'image avec la configuration de l'environnement Python pour Windows
Traitement d'image 100 coups ①
Revenir en arrière lorsqu'une erreur se produit avec le tissu
Créez rapidement un serveur API avec Python + Falcon
Je veux convertir une image en WebP avec sucette
Créer un serveur local GIF animé avec Python + Flask
Remarques sur le traitement d'images HDR et RAW avec Python
Créez un fichier image à l'aide de PIL (Python Imaging Library).