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:
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á:
Výhodu to má v tom, že by sa dalo pokračovať úpravou metódy crop, čím by bolo možné výrezy centrovať:
Č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í.
- 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 | 8253
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 :)