rozsirenie Nette\Image o resize do boxu so zachovanim pomeru

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

Casto upravujem obrazky sposobom, ze obrazok potrebujem vyrezat a zmensit tak, aby bol zachovany pomer stan. Ak by to bolo pre niekoho zaujimave a zaroven by to David mal chut trosku ucesat a rozsirit Nette\Image, bolo by to idealne a nemusel by som si rozsirovat to sam :)

function canvas($width, $height, $attr) {

    $result= array();
    $deltas= array();
    $variants= explode(';', $attr);

    foreach($variants as $key => $variant)
    {
        list($a, $b)= explode('x', $variant);

        $w= round($a/$b*$height);
        if (($delta= ($width-$w))>=0) {
            $result[$delta]= (object) array( 'left' => round(($width-$w)/2), 'top' => 0, 'width' => $width-$delta, 'height' => $height);
            $deltas[]= $delta;
        }

        $h= round($b/$a*$width);
        if (($delta= ($height-$h))>=0) {
            $result[$delta]= (object) array( 'left' => 0 , 'top' => round($delta/2), 'width' => $width, 'height' => $height-$delta);
            $deltas[]= $delta;
        }
    }

    return $result[min($deltas)];
}


$image= Image::fromFile('sourceimg.png');
$crop= canvas($image->getWidth(),$image->getHeight(), '300x200;200x300');
$image->crop($crop->left, $crop->top, $crop->width, $crop->height);
if ( $image->getWidth() > $image->getHeight() ) {
    $image->resize(300,200);
}
else {
    $image->resize(200,300);
}
$image->send();

Nie je to napisane prave najelegantnejsie, aj to predavanie parametrov pre funkciu by sa dalo urcite spravit krajsie, ale pre nazornost to staci. A ak by David mal chut to pouzit, urcite si to tak ci tak upravi :)

kravčo
Člen | 721
+
0
-

Pokiaľ viem, Nette\Image predvolene zachováva pomer strán.

$img = Image::fromFile('images/photo.jpg');
$img->resize(300, 300);
$img->send();

Uvedený kód zmenší fotku na najväčší možný obrázok, ktorý sa zmestí do štvorca 300×300, teda pri pomere strán 3:2 vznikne buď fotka 300×200 alebo 200×300, podľa orientácie.