Změna velikosti obrázku přes filtr v latte

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Dan Hundrt
Člen | 74
+
0
-

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:

  1. Pokud neexistuje obrázek, vrať false (může být i ‚no-image.jpg‘, je to vcelku jedno)
  2. 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
+
+2
-

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
+
0
-

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
+
0
-

Hug0 napsal(a):

Ahoj…

Ahoj,

díky moc, vcera jsem na to koukal a vypada to moc pekne. Zkusim.

Dan Hundrt
Člen | 74
+
+1
-

Koukam jsem na balicek, dotblue/nette-webimages funguje velmi dobre, diky!