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