Funkce pro resize obrázků

Dlouho jsem na internetu hledal nějakou funkci, která by jednoduše uměla resizovat obrázky, ale žádnou vhodnou jsem nenašel. Buď fungovala jen částečně nebo byla příliš komplexní a pro moje potřeby zbytečně složitá. Proto jsem se rozhodl napsat vlastní funkci, která mým požadavkům vyhovuje nejlépe. Funkce je rozebrána formou komentářů ve zdrojovém kódu.

<?php
function resizePhoto($vstup,$vystup,$width,$height,$aspectratio,$quality)  {

   /*
   $vstup //cesta k původnímu obrázku
   $vystup //cesta ke zmenšenému obrázku
   $width //šířka zmenšeného obrázku
   $height //délka zmenšeného obrázku
   $aspectratio //zachovávat poměr stran (0/1)
   $quality //komprese (100 - nejlepsi) - doporucuji 75
    */

    if(file_exists($vstup)){  //nejprve zjistíme, zda-li byl zadán vstup a existuje
        $vstup = ImageCreateFromJPEG($vstup);  //načteme si obrázek do proměnné
    } else {
        echo "resizePhoto: Nebyl zadán vstup !";
        return false;
    }

    $vstup_wd = imagesx($vstup); //zjistíme šířku původního obrázku
    $vstup_ht = imagesy($vstup);  //zjistíme délku původního obrázku

    if($vstup_wd <= $width && $vstup_ht <= $height) {
        //pokud je obrázek menší než požadovaná velikost nebudeme počítat nové hodnoty
        $width = $vstup_wd;
        $height = $vstup_ht;
    } else {

        if($aspectratio) {
            //pokud je zaplý aspect ratio spočítáme novou velikost v daném poměru
            $w = round($vstup_wd * $height / $vstup_ht);
            $h = round($vstup_ht * $width / $vstup_wd);
            if(($height-$h)<($width-$w)){
                $width =& $w;
            } else {
                $height =& $h;
            }

        }
    }

    $temp = imageCreateTrueColor($width,$height);
    //vytvoříme obrázek o rozměrech zmenšeného obrázku
    imageCopyResampled($temp, $vstup, 0, 0, 0, 0, $width, $height, $vstup_wd, $vstup_ht);
    //obrázky zkopíruje na sebe, takže dojde vlastně ke zmenšení výsledného obrázku
    ImageJPEG($temp, $vystup, $quality);
    //uložíme zmenšený obrázek na výstup
    imagedestroy($vstup); //uvolnime pamět
    imagedestroy($temp); //uvolnime pamět
}
//příklad použítí
resizePhoto('kyticka.jpg','kyticka_mala.jpg','160','160','1','75');
?>

Dále by se dala funkce rozšířit o resize více typů obrázků PNG, GIF a na vstupu kontrolovat, zda se jedná opravdu o obrázek v daném typu, například pomocí regulérních výrazů. Funkci můžete volně použít kde chcete bez udání autora. Akorát bych byl rád za zmínku v komentářích, jestli se skript někomu hodil.



Komentáře

  1. ziki 19.11.06 17:47

    Comment Arrow

    AHOJ, mockrát dík za tuhle funkcičku, ušetřil jsi mi spoustu času, je to přesně to co jsem hledal. Funguje výborně, supr práce.. DÍK !


  2. radim 05.12.09 23:52

    Comment Arrow

    goog job:-)


  3. henten 07.11.10 21:16

    Comment Arrow

    Vyborne! Presne tot potrebuju, jednoduche, efektivni. Jen … neveel by nekdo jak to poupravit aby se dalo zmensit treba 5 fotek najednou?


  4. Daniel Šenkyřík 25.01.13 23:38

    Comment Arrow

    diky, hodilo se :)




O autorovi

Pari

Vítejte na mém blogu, rád bych se v krátkosti představil. Je mi 26 let. Momentálně nejvíce času věnuji projektu Lepime.cz - obchod se samolepkami na zeď a tvorbě webů postavených na redakčním systému Drupal pod značkou MEPA.CZ.