Oříznutý náhled obrázku

před 10 lety

Honza Marek
Člen | 1674
+
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.

před 10 lety

David Grudl
Nette Core | 6884
+
0
-

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

před 10 lety

Panda
Člen | 570
+
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)

před 10 lety

Honza Marek
Člen | 1674
+
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.

před 10 lety

kravčo
Člen | 723
+
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?

před 10 lety

Panda
Člen | 570
+
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.

před 10 lety

kravčo
Člen | 723
+
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.

před 10 lety

Honza Marek
Člen | 1674
+
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;
}

před 10 lety

kravčo
Člen | 723
+
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á.

před 10 lety

Ondřej Brejla
Člen | 748
+
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?

před 10 lety

cuga
Člen | 212
+
0
-

jak nakonec oriznuti dopadlo? uz je v distribuci?

před 10 lety

Honza Marek
Člen | 1674
+
0
-

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

před 10 lety

kravčo
Člen | 723
+
0
-

Je to na githube.

před 10 lety

Honza Marek
Člen | 1674
+
0
-

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

před 10 lety

Jod
Člen | 703
+
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)

před 10 lety

kravčo
Člen | 723
+
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…

před 10 lety

David Grudl
Nette Core | 6884
+
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.

před 10 lety

kravčo
Člen | 723
+
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 :)