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:
W opisywanym przypadku, na wszystkie 3 pytania odpowiedziano twierdząco.
Sposób wykonywania edycji zdjęć.
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:
Aby nie uruchamiać programu do edycji co jakiś czas utworzono prosty skrypt w języku Python do obróbki tych zdjęć.
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.
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")
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")
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:
@echo off
cmd /k "cd /d C:Usersdell0PycharmProjectsMakeImageSquarevenvScripts & activate
& cd /d C:Usersdell0PycharmProjectsMakeImageSquare & python ImageEditor.py -s %*"
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