You are browsing the unmaintained documentation for old Nette 2.1. See documentation for current Nette.

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!

Vylepšit tuto stránku