1 lutego 2022

Automatyzacja pracy na przykładzie edycji zdjęć

Automatyzacja pracy na przykładzie edycji zdjęć

Skrypt do edycji zdjęć

Utworzono klasę z metodami do edycji grafiki z trzema metodami, które odpowiadają między innymi za dodawanie i redukcję marginesów.

Metoda create_square sprawia, że grafika wejściowa staję się kwadratowa za pomocą dodania marginesów.

Metody wybierane są za pomocą parametrów podanych w konsoli - oczywiście nie bezpośrednio, ale o tym za chwilę.

import sys
from PIL import Image

class ImageEditor():
    def create_square(self, item):
        pass

    def add_margin(self, img, top, right, bottom, left, color):
        pass

    def reduce(self, item):
        pass

if __name__ == '__main__':
    ie = ImageEditor()

    if(sys.argv[1] ==  "-s"):
        ie.create_square(sys.argv[2])

    if(sys.argv[1] ==  "-r"):
        ie.reduce(sys.argv[2])

Metoda add_margin w zależności od przyjętych argumentów uzupełni marginesy zadanym kolorem i zwróci nowe zdjęcie.

Metoda create_square za pomocą powyższej metody utworzy na podstawie wejściowego zdjęcia jego kwadratową wersję wypełniając zadanym kolorem - w tym przypadku białym.

Jednak uruchamianie takiego skryptu nie jest szybsze niż uruchamianie programu do obróbki zdjęć. W kolejnym etapie dodano skrypt do menu kontekstowego systemu Windows. W ten sposób edycja zdjęcia wymaga dokładnie dwóch kliknięć myszką.

 def add_margin(self, img, top, right, bottom, left, color):
        width, height = img.size
        new_width = width + right + left
        new_height = height + top + bottom
        result = Image.new(img.mode, (new_width, new_height), color)
        result.paste(img, (left, top))
        return result
def create_square(self, item):
        img = Image.open(item)
        width, height = img.size
        margin_size = width - height
        if margin_size > 0:
            result = self.add_margin(img,
                                     top=int(margin_size/2),
                                     right=0,
                                     bottom=int(margin_size/2),
                                     left=0,
                                     color= "#FFFFFF")
        else:
            result = self.add_margin(img,
                                     top=0,
                                     right=int(-margin_size/2),
                                     bottom=0,
                                     left=int(-margin_size/2),
                                     color= "#FFFFFF")
        result.save(item.replace(".jpg", "")
                    .replace(".png","") + "Sq" + ".jpg")

Menu kontekstowe Windows - Python

Aby przyśpieszyć przerabianie zdjęć warto edytować zdjęcie korzystając z szybkiego dostępu poprzez menu kontekstowe. Aby dodać własny program do menu należy ustawić odpowiednie dane w rejestrze systemu za pomocą przykładowego skryptu:

import os
from winregistry import WinRegistry

class MenuContextItem:
    def register_as_menu_context_item(self):
        self.REG_PATH_NEW = r"HKEY_CLASSES_ROOTSystemFileAssociations.jpgShellQuickSquareMeCommand"
        with WinRegistry() as client:
            client.create_key(self.REG_PATH_NEW)
            client.write_entry(self.REG_PATH_NEW, "", os.getcwd() + r"run.bat %1")
Edycję rejestru można przeprowadzić ręcznie, ale znaczniej wygodniej jest korzystać ze skryptu. Powyższy fragment kodu należy wykonać z uprawnieniami administratora.
import ctypes, sys
from MenuContextItem import MenuContextItem

def is_admin():
    try:
        return ctypes.windll.shell32.IsUserAnAdmin()
    except:
        return False

if __name__ == '__main__':
    if is_admin():
        print("Admin privilege")
    else:
        print("Ask for Admin privilege")
        ctypes.windll.shell32.ShellExecuteW(None,
                                            "runas",
                                            sys.executable,
                                            " ".join(sys.argv),
                                            None,
                                            1)
    reg = MenuContextItem()
    reg.register_as_menu_context_item()

System Windows nie potrafi wykonywać plików skryptów bez środowiska Python, więc warto zastosować plik .bat, który:

  • uruchomi środowiskowo wirtualne, które zawiera zainstalowane wcześniej pakiety (m.in "Pillow" do edycji grafiki),
  • uruchomi wybrany skrypt przekazując do niego odpowiednie parametry.
@echo off
cmd /k "cd /d C:Usersdell0PycharmProjectsMakeImageSquarevenvScripts & activate 
& cd /d C:Usersdell0PycharmProjectsMakeImageSquare & python ImageEditor.py -s %*"

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

KEYWEB

Keyweb to nowoczesny software house - tworzymy i rozwijamy produkty informatyczne dla klientów z całego świata.
KONTAKT
keyweb@keyweb.pl
linkedin facebook pinterest youtube rss twitter instagram facebook-blank rss-blank linkedin-blank pinterest youtube twitter instagram