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
resize
a 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 | 8218
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::WINDOW
radě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 :)