Oříznutý náhled obrázku
 
- Honza Marek
- Člen | 1664
Š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.
 
- Panda
- Člen | 569
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
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
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
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
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
resizea podruhé přicrop). A fakt, že by se k použitelnosti ještě musela přepsat metodacrop, 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
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;
}
 
- Ondřej Brejla
- Člen | 746
Jj thumbnail() zní lépe…ale když už, tak asi nějaké
sloveso, něco jako createThumbnail()? nebo
makeThumbnail()?… To je asi lepší ne?
 
- David Grudl
- Nette Core | 8285
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
David Grudl napsal(a):
kravčovy úpravy metod
crop()aresize()jsem dal do repositáře, jen místoImage::WINDOWraději zvolilImage::FILL.
Image::WINDOW nebol šťastný názov, no bol najlepší, aký
som dokázal vymyslieť. Image::FILL danú situáciu rozhodne
vystihuje lepšie :)

