Prendre une capture d'écran en Python

Créé parce que j'ai pu transmettre une partie de l'image du bureau à un autre programme avec python.

environnement

Windows10

Mouvement

  1. Enregistrer et afficher les images du bureau
  2. Faites glisser et déposez pour sélectionner une plage
  3. Découpez et enregistrez la pièce sélectionnée

code

python_screenshot.pyw


import datetime
import os
from ctypes import windll
from PIL import Image, ImageGrab
import tkinter as tk

class CropScreenShot(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.flag = False
        current_dir = os.path.split(os.path.abspath(__file__))[0]
        self.ss_folder = os.path.join(current_dir,'crop_screen_shot_temp')
        os.makedirs(self.ss_folder, exist_ok=True)
        
        self.make_ss()
        root.minsize(self.screen_width, self.screen_height)
        self.image = tk.PhotoImage(file=self.ss_file_path)
        self.draw_ss(self.image,self.screen_width, self.screen_height)
        
    def make_ss(self):
        self.screen_width = windll.user32.GetSystemMetrics(0)
        self.screen_height = windll.user32.GetSystemMetrics(1)

        dt_now = datetime.datetime.now()
        ss_name = 'ss_{}.png'.format(dt_now.strftime('%Y%m%d_%H%M%S'))
        self.ss_file_path = os.path.join(self.ss_folder, ss_name)

        screen_shot = ImageGrab.grab().resize((self.screen_width, self.screen_height))
        screen_shot.save(self.ss_file_path)
    
    def draw_ss(self,image,width,height):
        self.canvas = tk.Canvas(bg='black', width=width, height=height)
        self.canvas.place(x=0, y=0)
        self.canvas.create_image(0, 0, image=image, anchor=tk.NW)

        self.left_x = tk.IntVar(value=0)
        self.upper_y = tk.IntVar(value=0)
        self.right_x = tk.IntVar(value=width+1)
        self.lower_y = tk.IntVar(value=height+1)

        self.canvas.bind('<ButtonPress-1>',self.light_click_down)
        self.canvas.bind('<B1-Motion>',self.light_click_drag)
        self.canvas.bind('<ButtonRelease-1>',self.light_click_up)

    def crop_ss(self,left_x,upper_y,right_x,lower_y):
        pil_image = Image.open(self.ss_file_path)
        dt_now = datetime.datetime.now()
        crop_ss_name = 'crop_{}.png'.format(dt_now.strftime('%Y%m%d_%H%M%S'))
        crop_file_path = os.path.join(self.ss_folder, crop_ss_name)
        trim_image = pil_image.crop((left_x,upper_y,right_x,lower_y))
        new_width = right_x - left_x
        new_height = lower_y - upper_y
        new_image = Image.new(trim_image.mode, (new_width, new_height),'white')
        new_image.paste(trim_image, (0,0))
        new_image.save(crop_file_path)

    def delete_rectangle(self,tag):
        objs = self.canvas.find_withtag(tag)
        for obj in objs:
            self.canvas.delete(obj)

    def draw_rectangle(self,left_x,upper_y,right_x,lower_y):
        self.canvas.create_rectangle(
            left_x,
            upper_y,
            right_x,
            lower_y,
            outline='blue',
            width=2,
            tag='crop_area'
            )        

    def light_click_down(self,event):
        if self.flag == False:
            self.delete_rectangle(tag='crop_area')
            self.left_x.set(event.x)
            self.upper_y.set(event.y)
            self.right_x.set(event.x)
            self.lower_y.set(event.y)
            self.draw_rectangle(
                self.left_x.get(),
                self.upper_y.get(),
                self.right_x.get(),
                self.lower_y.get()
                )
            
    def light_click_drag(self,event):
        if self.flag == False:
            self.delete_rectangle(tag='crop_area')
            self.right_x.set(event.x)
            self.lower_y.set(event.y)
            if self.left_x.get() > self.right_x.get():
                if self.upper_y.get() > self.lower_y.get():
                    self.draw_rectangle(
                        self.right_x.get(),
                        self.lower_y.get(),
                        self.left_x.get(),
                        self.upper_y.get(),
                        )
                else:
                    self.draw_rectangle(
                        self.right_x.get(),
                        self.upper_y.get(),
                        self.left_x.get(),
                        self.lower_y.get(),
                        )
            else:
                if self.upper_y.get() > self.lower_y.get():
                    self.draw_rectangle(
                        self.left_x.get(),
                        self.lower_y.get(),
                        self.right_x.get(),
                        self.upper_y.get(),
                        )
                else:
                    self.draw_rectangle(
                        self.left_x.get(),
                        self.upper_y.get(),
                        self.right_x.get(),
                        self.lower_y.get(),
                        )
                
    def light_click_up(self,event):
        if self.flag == False:
            self.flag = True
            self.delete_rectangle(tag='crop_area')
            self.right_x.set(event.x)
            self.lower_y.set(event.y)
            if self.left_x.get() > self.right_x.get():
                if self.upper_y.get() > self.lower_y.get():
                    self.draw_rectangle(
                        self.right_x.get(),
                        self.lower_y.get(),
                        self.left_x.get(),
                        self.upper_y.get(),
                        )
                    self.crop_ss(
                        self.right_x.get(),
                        self.lower_y.get(),
                        self.left_x.get(),
                        self.upper_y.get(),
                        )
                else:
                    self.draw_rectangle(
                        self.right_x.get(),
                        self.upper_y.get(),
                        self.left_x.get(),
                        self.lower_y.get(),
                        )
                    self.crop_ss(
                        self.right_x.get(),
                        self.upper_y.get(),
                        self.left_x.get(),
                        self.lower_y.get(),
                        )
            else:
                if self.upper_y.get() > self.lower_y.get():
                    self.draw_rectangle(
                        self.left_x.get(),
                        self.lower_y.get(),
                        self.right_x.get(),
                        self.upper_y.get(),
                        )
                    self.crop_ss(
                        self.left_x.get(),
                        self.lower_y.get(),
                        self.right_x.get(),
                        self.upper_y.get(),
                        )
                else:
                    self.draw_rectangle(
                        self.left_x.get(),
                        self.upper_y.get(),
                        self.right_x.get(),
                        self.lower_y.get(),
                        )
                    self.crop_ss(
                        self.left_x.get(),
                        self.upper_y.get(),
                        self.right_x.get(),
                        self.lower_y.get(),
                        )
            root.destroy()
            

root = tk.Tk()
app = CropScreenShot(master=root)

app.mainloop()

référence

Merci à nos ancêtres. Décrit pour autant que je me souvienne. https://qiita.com/koara-local/items/6a98298d793f22cf2e36 https://note.nkmk.me/python-pillow-image-crop-trimming/ https://daeudaeu.com/programming/python/tkinter/trimming_appli/ https://betashort-lab.com/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0/python/tkinter%E3%81%A7%E7%94%BB%E5%83%8F%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%95%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95/

Recommended Posts

Prendre une capture d'écran en Python
[Python] Prenez une capture d'écran
[Python] [Windows] Faites une capture d'écran avec Python
Créer une fonction en Python
Créer un dictionnaire en Python
Créer un bookmarklet en Python
Dessinez un cœur en Python
Probablement dans un serpent Nishiki (Titre original: Peut-être en Python)
Ecrire une dichotomie en Python
[python] Gérer les fonctions dans une liste
Appuyez sur une commande en Python (Windows)
Créer un conteneur DI avec Python
Dessinez une matrice de diagramme de dispersion avec python
ABC166 en Python A ~ C problème
Ecrire des algorithmes A * (A-star) en Python
Créer un fichier binaire en Python
Résoudre ABC036 A ~ C avec Python
Ecrire un graphique à secteurs en Python
Ecrire le plugin vim en Python
Écrire une recherche de priorité en profondeur en Python
Implémentation d'un algorithme simple en Python 2
Résoudre ABC037 A ~ C avec Python
Exécutez un algorithme simple en Python
Dessinez un diagramme CNN en Python
Créer une chaîne aléatoire en Python
Lors de l'écriture d'un programme en Python
Python en optimisation
CURL en Python
Métaprogrammation avec Python
Livre en spirale en Python! Python avec un livre en spirale! (Chapitre 14 ~)
Résoudre ABC175 A, B, C avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
Utiliser l'impression dans l'expression lambda Python2
Un client HTTP simple implémenté en Python
Faites une visite Euler non récursive en Python
Méta-analyse en Python
J'ai fait un programme de gestion de la paie en Python!
Précautions lors du décapage d'une fonction en python
Unittest en Python
Ecrire le test dans la docstring python
Afficher une liste d'alphabets en Python 3
Essayez d'envoyer un paquet SYN en Python
Essayez de dessiner une animation simple en Python
Créer une application GUI simple en Python
Époque en Python
Discord en Python
Ecrire une courte définition de propriété en Python
Dessiner un cœur avec Python Partie 2 (SymPy Edition)
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
Exécuter l'interpréteur Python dans le script
N-Gram en Python
Comment obtenir stacktrace en python
Programmation avec Python