Změna velikosti obrázku přes filtr v latte
- Dan Hundrt
- Člen | 74
Zdravím,
rád bych se Vás zeptal, jak by jste řešili následující problém.
Obrázky ukládám vždy v originálním rozlišení, vždy jako JPG. Rád bych si rozměry určoval přímo v latte, tj něco takového:
$this->template->addFilter('picture', function ($image, $width, $height, $folder) {
return $this->image->resizeImage($image, $width, $height, $folder);
});
Mám vytvořený manager čistě pro práci s obrázky, něco jako:
public function resizeImage(string $image, int $width, int $height, string $folder)
{
// ...
}
Teď ale otázka jak obrázky zmenšovat, resp. jak v metodě řešit, zmenšování. Napsal jsem si v metodě tento postup:
- Pokud neexistuje obrázek, vrať false (může být i ‚no-image.jpg‘, je to vcelku jedno)
- Pokud existuje a neexistuje náhled, vytvoříme ho a vrátíme filemtime náhledu:
Image::fromFile($image)->resize($width, $height)->save(self::THUMB . filemtime($image) . '.jpg');
return filemtime($image)
3. Pokud existuje originál i náhled, vrátíme pouze
return filemtime($image)
V latte používám makro:
{$art->getId(),500,500,'article'|picture}
Přijde mi to celé krokolomné a ne moc safe, pokud do toho mám ještě míchat mazání náhledu, pokud se file změnil. Nemá někdo lepší řešení, nějaký fígl, hotovou metodu? Definovat rozměry a generování náhledů v latte mi přijde jednoduché.
Co koukám do laděnky, tak filemtime() použitý v 50ti iteracích není úplně levný.
Díky
- matopeto
- Člen | 395
Neni to dobry pristup, generovanie obrazkov az v latte ti spomaluje
nacitanie stranky. Sprav si Nieco ako ImagePresenter, ktory dostane id obrazku a
vygeneruje nahlad, pripadne noimage a zacachuje si to. Potom pouzi iba nieco ako
<img src="{link Image ...parametre...}">
a mas to
asynchronne
Editoval matopeto (28. 6. 2017 9:13)
- Hug0
- Člen | 35
Ahoj,
možností jak vytvářet náhledy je více. Doporučuji pročíst vlákno Generovani
vice variant obrazku [best practice].
U tvého řešení bude problém s rychlostí jak píše @matopeto a možná i pamětí. Lepší řešení je v odkazovaném vlákně v bodu 2.2. V latte sestavíš url obrázku (podle nějaké masky – třeba „<id>-<width>x<height>.jpg“) a náhledy se vytvářejí až když o ně požádá prohlížeč.
Já na to používám knihovnu dotblue/nette-webimages.
- Dan Hundrt
- Člen | 74
Hug0 napsal(a):
Ahoj…
Ahoj,
díky moc, vcera jsem na to koukal a vypada to moc pekne. Zkusim.