Práce s obrázky
Třída Nette\Image zjednodušuje manipulaci s obrázky, jako je změna velikosti, oříznutí, doostření, kreslení nebo spojování více obrázků.
PHP disponuje rozsáhlou sadou funkcí pro manipulaci s obrázky. Ale jejich API není moc pohodlné. To by nebyl Nette Framework, aby nepřišel se sexy API.
Instalace:
composer require nette/utils
Všechny příklady předpokládají vytvořený alias:
use Nette\Image;
Vytvoření obázku
Vytvoříme nový TRUE color obrázek, například s rozměry 100×200:
$image = Image::fromBlank(100, 200);
Volitelně lze určit barvu pozadí (výchozí je černá):
$image = Image::fromBlank(100, 200, Image::rgb(125, 0, 0));
Nebo obrázek načteme ze souboru:
$image = Image::fromFile('nette.jpg');
Potřebujete při načtení detekovat formát obrázku? Metoda ho vrátí v druhém parametru:
$image = Image::fromFile('nette.jpg', $type);
// $type bude Image::JPEG, Image::PNG, Image::GIF
Uložení obrázku
Obrázek lze uložit do souboru:
$image->save('resampled.jpg');
Můžeme určit kvalitu komprese v rozsahu 0..100 pro JPEG (výchozí 85) a WEBP (výchozí 80) a 0..9 pro PNG (výchozí 9):
$image->save('resampled.jpg', 80); // JPEG, kvalita 80%
Pokud z přípony souboru není zřejmý formát, lze ho určit jednou z konstant Image::JPEG
,
Image::PNG
, Image::GIF
:
$image->save('resampled.tmp', NULL, Image::JPEG);
Obrázek lze místo na disk zapsat do proměnné:
$data = $image->toString(Image::JPEG, 80); // JPEG, kvalita 80%
nebo poslat přímo do prohlížeče s příslušnou HTTP hlavičkou Content-Type
:
// odešle hlavičku Content-Type: image/png
$image->send(Image::PNG);
Změna velikosti
Častou operací je změna rozměrů obrázku. Akutální rozměry vrací metody getWidth()
a
getHeight()
.
Ke změně slouží metoda resize()
. Příklad proporcionální změny velikosti tak, aby nepřesáhl rozměry
500×300 pixelů (buď bude šířka přesně 500 px nebo výška bude přesně 300 px, jeden z rozměrů se dopočítá tak,
aby byl zachován poměr stran):
$image->resize(500, 300);
Je možné specifikovat jen jeden rozměr a druhý se dopočítá:
$image->resize(500, NULL); // šířka 500px, výška se dopočítá
$image->resize(NULL, 300); // šířka se dopočítá, výška 300px
Kterýkoliv rozměr je možné uvést i v procentech:
$image->resize('75%', 300); // 75 % × 300px
Chování resize
lze ovlivnit následujícími příznaky:
Příznak | Popis |
---|---|
Image::FIT (výchozí) |
výsledné rozměry budou menší nebo rovny požadovaným rozměrům |
Image::FILL |
vyplní (a případně přesáhne v jednom rozměru) cílovou plochu |
Image::EXACT |
vyplní cílovou plochu a ořízne to, co přesáhne |
Image::SHRINK_ONLY |
pouze zmenšování (zabrání roztažení malého obrázku) |
Image::STRETCH |
nezachovávat poměr stran |
Příznaky se uvádějí jako třetí argument funkce:
$image->resize(500, 300, Image::STRETCH);
Příznaky lze kombinovat:
$image->resize(500, 300, Image::SHRINK_ONLY | Image::STRETCH);
Obrázky lze vertikálně nebo horizontálně překlopit tak, že jeden z rozměrů (případně oba) uvedeme jako záporné číslo:
$flipped = $image->resize(NULL, '-100%'); // flip vertical
$flipped = $image->resize('-100%', '-100%'); // rotate 180°
$flipped = $image->resize(-125, 500); // resize & flip horizontal
Po zmenšení obrázku je možné vylepšit jeho vzhled jemným doostřením:
$image->sharpen();
Oříznutí
Pro oříznutí slouží metoda crop()
:
$image->crop($left, $top, $width, $height);
Podobně jako u resize()
mohou být všechny hodnoty uvedeny v procentech. Procenta u $left
a
$top
se počítají ze zbylého místa, podobně jako u CSS vlastnosti background-position
:
$image->crop('100%', '50%', '80%', '80%');
Kreslení a úpravy
Můžeš kreslit, můžeš psát, ale listy netrhat.
Jsou vám k dispozici všechny funkce PHP pro práci s obrázky, jako například imagefilledellipse, ale v objektovém hávu:
$image->filledEllipse($cx, $cy, $width, $height, Image::rgb(255, 0, 0, 63));
Viz Přehled metod.
Spojení více obrázků
Do obrázku lze snadno vložit jiný obrázek:
$logo = Image::fromFile('logo.png');
$blank = Image::fromBlank(320, 240, Image::rgb(52, 132, 210));
// souřadnice lze uvést opět v procentech
$blank->place($logo, '80%', '80%'); // vložíme poblíž pravého dolního rohu
Při vkládání se respektuje alphakanál, navíc můžeme ovlivnit průhlednost vkládaného obrázku (vytvoříme tzv. watermark):
$blank->place($image, '80%', '80%', 25); // průhlednost je 25 %
Takové API je skutečně radost používat!