1 lutego 2022

Automatyzacja pracy na przykładzie edycji zdjęć

Automatyzacja pracy na przykładzie edycji zdjęć

Automatyzacja pracy

Automatyzacja pracy (szczególnie nudnej i powtarzalnej) nie tylko przynosi oszczędności firmie i klientom, ale również ułatwia życie pracownikom. Proste, ale powtarzalne zadania mogą generować pomyłki oraz niepotrzebne zmęczenie wykonawcy. Nawet jeżeli automatyzacja danego procesu jest bardziej czasochłonna niż sam proces to warto zadać sobie 3 pytania:

  1. Czy w procesie manualnym powstają błędy i da się je wykluczyć automatyzując proces?
  2. Czy podobny problem może zaistnieć w przyszłości?
  3.  Czy proces automatyzacji jest dla nas mniej męczący niż dana praca?

W opisywanym przypadku, na wszystkie 3 pytania odpowiedziano twierdząco.

Sposób wykonywania edycji zdjęć.

Automatyczna edycja zdjęcia produktu

Podczas synchronizacji produktów co jakiś czas pojawiało się zdjęcie o nieregularnym rozmiarze, które należało ze sklepu pobrać, poprawić, a następnie wgrać na serwer. Niestety, w opisywanym przypadku nie ma sztywnej reguły oceny, które zdjęcia należy poprawiać, a które nie - ta decyzja zależy od "Eksperta", czyli w naszym przypadku od właściciela sklepu.

Edycja zdjęć polega na bardzo prostych zmianach:

  • niektóre zdjęcia wymagają zmniejszenia (redukcji marginesów),
  • niektóre zdjęcia wymagają dodania białych marginesów na górze i dole lub bokach, aby zdjęcie było kwadratowe, a produkt wycentrowany.

Aby nie uruchamiać programu do edycji co jakiś czas utworzono prosty skrypt w języku Python do obróbki tych zdjęć.

Automatyczna edycja zdjęcia produktu

Docelowy sposób działania skryptów do edycji grafiki. W zależności od wybranej pozycji w menu kontekstowym - obraz będzie kwadratowy lub marginesy zostaną zredukowane.

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 %*"

Szybka edycja grafiki

W rezultacie otrzymaliśmy nowe pozycję w menu kontekstowym systemu Windows. Dodanie nowych rozszerzeń obrazów oraz metod edycji to zaledwie kilka minut. Oczywiście

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