Náhled obrázku v PHP (OOP) / vyšší abstrakce
Ještě před vlastním tvořením třídy na tvorbu vodotisků jsem se rozhodl provést vyšší abstrakci třídy pro vytváření náhledů. Protože všechny objekty co pracují s obrázky mají něco společného, je vhodné vytvořit abstrakci objektu obrázek.
Při prostudování článku Náhled obrázku v PHP a při hrubém návrhu dalších tříd co by měli pracovat s obrázky, vidím, že tyto třídy mají společný základ.
Všechny třídy výsledný obrázek buď ukládají nebo posílají na výstup, počítají hodnotu kvality obrázku, počítají rozměry obrázku, musí vytvářet zdrojový obrázek na základě mime typu pro další zpracování apod. Proč tedy neprovést vyšší abstrakci a nevytvořit novou třídu Image. Logicky je tato abstrakce podle mne správná a odpovídá i reálnému obrazu skutečnosti. I ve skutečnosti by měly tyto objekty společný základ ve všech možných situacích.
Ať už budu vytvářet jakékoli třídy s různými cíly, pokud budou pracovat s obrázky budou muset pracovat s hodnotami: cesta k souboru, kvalita, identifikátor vytvořeného obrázku a rozměr obrázku, zároveň budou muset umět tyto operace: uložit výsledný obrázek (jakkoli zpracovaný předchozími procesy), zobrazit na obrazovce, vytvořit obrázek na základě cesty, zjistit rozměry nebo vypočítat kvalitu obrázku pro jpeg i png a podobné funkce.
Abstrahoval jsem tedy tyto vlastnosti a metody a výsledkem byla nová třída Image. Thumb rozšiřuje třídu Image a implementuje další vlastnosti a metody. Narozdíl od předchozího článku jsem přidal možnost stanovení pevné výšky a šířky, která má přednost před nastavením maximálních parametrů a volbu určující podle čeho se mají vypočítat výsledné rozměry.
- <?
- class Image {
- public $source, $quality;
- private $image, $imagesize;
- public function __construct($source, $quality=100) {
- $this->source = $source;
- $this->quality = $quality;
- }
- public function save($destination) { }
- public function show() { }
- public function setQuality() { }
- public function setImage() { }
- public function getImage() { }
- public function getMimeType() { }
- public function getImageSize() { }
- public function getComputedQuality() { }
- }
- ?>
Další požadovanou vlastností pro třídu Image je, aby bylo stanovitelné zda má odstranit již zpracovaný obrázek. Tuto vlastnost, kde lze pracovat se stejným obrázkem aniž by musel být znovu vytvářen pomocí funkce imagecreatefromXXX, lze využít ve zpracování v cyklu, kdy v ruzných redakčních systémech potřebujeme vytvořit například sadu obrázků různé velikosti, tedy střední, malý a detailní náhled. Stejně tak můžeme předávat identifikátor obrázku pro zpracování jiným procesům. Např. třídě pro vytvoření vodotisku.
Rozšíření Thumb bude pak vypadat takto:
- <?
- class Thumb extends Image {
- public $WMax, $HMax, $width, $height;
- private $computedsize;
- public function __construct($source, $WMax=1000, $HMax=1000, $quality=100) {
- parent::__construct($source, $quality);
- $this->WMax = $WMax;
- $this->HMax = $HMax;
- }
- public function createThumb($destination) {
- $this->save($destination);
- }
- public function showThumb() {
- $this->show();
- }
- public function savecopy($destination) { }
- public function save($destination, $destroyoriginal=1) { }
- public function show() {}
- public function setMaxSize($size) {}
- public function setSize($size) {}
- public function useMaxSize($s=1) {}
- public function getComputedSize($size=null) { }
- }
- ?>
Základní cíle jsou stanoveny a teď se pustíme do psaní kódu. Kompletní impelmentaci si můžete prohlédnout ve zdroji ke stažení. Funkce createThumb a showThumb byli implementovány kvůli zpětně kompatibilitě s předchozím příkladem.
komentáře
RSS Komentáře


