Oříznutý náhled obrázku

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

Šlo by udělat volbu, při které se obrázek Nette\Image metodou resize zmenší do požadované velikosti tak, že ani jedna ze stran nebude menší než je požadovaná velikost a zbytek se ořízne? Potřeboval bych nedeformované čtvercové náhledy fotek a teď k tomu Nette\Image není vůbec použitelný. Pokud by tento popis nebyl pochopitelný, upřesním.

Použití bych si představil zhruba takhle:

$image->resize(50, 30, Image::CROP);

Díky.

David Grudl
Nette Core | 8227
+
0
-

Ty jsi šikovný programátor, ty to zvládneš poslat patch ;)

Panda
Člen | 569
+
0
-

Sice nejsem Honza Marek, ale už jsem něco podobného potřeboval: http://jan.smitka.org/…-Image.patch. Řešení možná není úplně nejlepší, ale minimálně jako základ někomu dalšímu (třeba Honzovi) by to posloužit mohlo.

Editoval Panda (1. 10. 2009 16:42)

Honza Marek
Člen | 1664
+
0
-

Já myslim, že je to dobrý. Šel jsem na to velmi podobně, ale měl jsem tam nějakou chybu. Asi protože jsem nepochopil, co dělá který argument funkce imagecopyresampled.

kravčo
Člen | 721
+
0
-

Podľa mňa to ide aj jednoduchšie:

diff --git a/Nette/Image.php b/Nette/Image.php
index 28937a2..4f02cbe 100644
--- a/Nette/Image.php
+++ b/Nette/Image.php
@@ -48,6 +48,7 @@ class Image extends Object
 	/**#@+ resizing flags {@link resize()} */
 	const ENLARGE = 1;
 	const STRETCH = 2;
+	const WINDOW = 4;
 	/**#@-*/

 	/**#@+ @int image types {@link send()} */
@@ -309,6 +310,10 @@ class Image extends Object
 				$scale[] = $newHeight / $height;
 			}

+			if ($flags & self::WINDOW) {
+				$scale = array(max($scale));
+			}
+
 			if (($flags & self::ENLARGE) === 0) {
 				$scale[] = 1;
 			}

Použitie vyzerá:

$img->resize(50, 50, Image::WINDOW)
    ->crop(0, 0, 50, 50);

Výhodu to má v tom, že by sa dalo pokračovať úpravou metódy crop, čím by bolo možné výrezy centrovať:

$img->resize(50, 50, Image::WINDOW)
    ->crop('50%', '50%', 50, 50);

Čo si o tom myslíte?

Panda
Člen | 569
+
0
-

Mě osobně se navrhované jednodušší řešení moc nelíbí. Je sice jednoduché na implementaci do Nette, ale složitější na programátora i systémové prostředky (obrázek se 2× překopírovává, jednou při resize a podruhé při crop). A fakt, že by se k použitelnosti ještě musela přepsat metoda corp, tomu moc nenahrává.

Na druhou stranu by zde byla větší volnost v použití, mé řešení pří oříznutí jen centruje a další nastavování flagů by kód značně znepřehlednilo.

kravčo
Člen | 721
+
0
-

Panda napsal(a):

Mě osobně se navrhované jednodušší řešení moc nelíbí. Je sice jednoduché na implementaci do Nette, ale složitější na programátora i systémové prostředky (obrázek se 2× překopírovává, jednou při resize a podruhé při crop). A fakt, že by se k použitelnosti ještě musela přepsat metoda crop, tomu moc nenahrává.

Na druhou stranu by zde byla větší volnost v použití, mé řešení pří oříznutí jen centruje a další nastavování flagů by kód značně znepřehlednilo.

Jednoduchosť implementácie ako výhodu nevyzdvihujem, ide mi skôr o značnú voľnosť, ktorú toto riešenie poskytuje. Myslím si, že čiastočne použiteľné je i bez úpravy metódy crop – zarovnáva vľavo hore.

Honza Marek
Člen | 1664
+
0
-

kravčo

Taky to není špatné, ale asi bych se pak ani nestyděl přidat metodu cropResize. Současný způsob použití mi nepřijde pro začátečníky úplně intuitivní.

public function cropResize($width, $height, $x = '50%', $y = '50%')
{
	$this->resize($width, $height, Image::WINDOW)
		->crop($x, $y, $width, $height);
	return $this;
}
kravčo
Člen | 721
+
0
-

Isteže, ten zápis nie je dvakrát pohodlný :)

Metóda je fajn nápad, no ja by som ju nazval inak. Takto mi totiž vôbec nie je jasné, čo robí. Nazval by som ju jednoducho thumbnail() – na to je predsa určená.

Ondřej Brejla
Člen | 746
+
0
-

Jj thumbnail() zní lépe…ale když už, tak asi nějaké sloveso, něco jako createThumbnail()? nebo makeThumbnail()?… To je asi lepší ne?

cuga
Člen | 210
+
0
-

jak nakonec oriznuti dopadlo? uz je v distribuci?

Honza Marek
Člen | 1664
+
0
-

Nevšimnul jsem si, takže bohužel asi ne :(

kravčo
Člen | 721
+
0
-

Je to na githube.

Honza Marek
Člen | 1664
+
0
-

Díky, takže máš u mě to pivo ;)

Jod
Člen | 701
+
0
-

Čo tu riešite? :D Minule som spúštal script nad 100k thumbnailoch a všetky mi zmenšilo a orezalo dobre.
Ale dik, lepšie jeden riadok než 20 :)

Editoval Jod (19. 10. 2009 8:39)

kravčo
Člen | 721
+
0
-

No, riešili sme práve tých 20 riadkov… Nie, že by to nešlo, ale práve táto jedna (vcelku častá) úloha je myslím teraz podstatne jednoduchšia…

David Grudl
Nette Core | 8227
+
0
-

kravčovy úpravy metod crop() a resize() jsem dal do repositáře, jen místo Image::WINDOW raději zvolil Image::FILL.

Metodu thumbnail zatím ne, jednak by se měla jmenovat jinak (není sloveso) a nejsem si jist, jestli pro účelové užití return $image->resize(...)->crop(...) je potřeba zavádět další metodu.

kravčo
Člen | 721
+
0
-

David Grudl napsal(a):

kravčovy úpravy metod crop() a resize() jsem dal do repositáře, jen místo Image::WINDOW raději zvolil Image::FILL.

Image::WINDOW nebol šťastný názov, no bol najlepší, aký som dokázal vymyslieť. Image::FILL danú situáciu rozhodne vystihuje lepšie :)