Autor Zpráva
honz@
Profil *
Zdravím,

Jsem v PHP začátečníkem a chtěl bych od Vás pomoc. Potřeboval bych, aby se automaticky obrázky ořezaly na čtverec o požadovaných rozměrech. Našel jsem tady na fóru několik let staré vlákno, kde byl tento kód:

<?php
$path = 'obrazky';
list($src_w, $src_h, $typ)=getimagesize($path);

$src_img=imagecreatefromjpeg($path);
$big_img=imagecreatetruecolor(150, 150);

if($src_w == $src_h)
{
    $s_w = $s_h = 0;
    $t = $src_w;
}
elseif($src_w > $src_h)
{
    $t = $src_h;
    $s_h = 0;
    $s_w = round(($src_w - $src_h) / 2);
}
elseif($src_w < $src_h)
{
    $t = $src_w;
    $s_w = 0;
    $s_h = round(($src_h - $src_w)/2);
}

imagecopyresampled($big_img, $src_img, 0, 0, $s_w, $s_h, 150, 150, $t, $t);
header('Content-type: image/jpeg');
imagejpeg($big_img);
?>


Funguje zcela výborně, ovšem nepodařilo se mi ho upravit tak, aby ořezával hromadně několik obrázků. Napadlo mě to spojit třeba s OpenDir.
Díky moc za jakoukoli odpověď!
php
Profil
takhle se ti to boužel nepovede, protože funkce
imagejpeg($big_img);
odesílá data uživateli a proto když ti to pojede podruhý tak ti nebude fungovat
header('Content-type: image/jpeg'); //php manual: header() must be called before any actual output is sent

takže by možná šlo místo
imagejpeg($big_img);
daný obrázek vždycky uložit a po uložení všech obrázku do nějaký složky je teprve načíst, nejsem si úplně jistý, jestli to je standartní postup.
Alphard
Profil
opendir() je možné, ale existují i funkce jako glob() nebo scandir().
<?php
function cropImage($inPath, $savePath = null)
{
    list($src_w, $src_h, $typ)=getimagesize($inPath); 
 
    $src_img=imagecreatefromjpeg($inPath); 
    $big_img=imagecreatetruecolor(150, 150); 
     
    if($src_w == $src_h) 
    { 
        $s_w = $s_h = 0; 
        $t = $src_w; 
    } 
    elseif($src_w > $src_h) 
    { 
        $t = $src_h; 
        $s_h = 0; 
        $s_w = round(($src_w - $src_h) / 2); 
    } 
    elseif($src_w < $src_h) 
    { 
        $t = $src_w; 
        $s_w = 0; 
        $s_h = round(($src_h - $src_w)/2); 
    } 
     
    imagecopyresampled($big_img, $src_img, 0, 0, $s_w, $s_h, 150, 150, $t, $t); 
    if (!empty($savePath))
    {
        imagejpeg($big_img, $savePath, 85);
    }
    else
    {
        header('Content-type: image/jpeg'); 
        imagejpeg($big_img); 
    }
}

foreach (glob("*.jpg") as $filename) 
{
    cropImage($filename, $filename); // pozor, takto přepíše původní obrázky
}
Schválně jsem vybral jen jpg, ta funkce jiné typy nepředpokládá. Muselo by se to ještě switchnout podle $typ.

Doplňuji druhý parametr, viz [#5] Alphard.
honz@
Profil *
Díky moc, ale asi dělám něco špatně, pořád to vypisuje jenom jeden ořezaný obrázek.
Alphard
Profil
honz@:
Aha, dát tam výpis víc obrázků je vlatně blbost. Buď přidejte parametr pro uložení, nebo to musíte volat jako samostatné soubory.

foreach (glob("images/*.jpg") as $filename)  
{ 
    echo '<img src="cropimage.php?path='.urlencode($filename).'">';
}
honz@
Profil *
Díky, ale pořád nic. Když doplním:
{ 
    echo '<img src="cropimage.php?path='.urlencode($filename).'">';
}


sice to vypíše přesný počet souborů, ale s příponou .php. Tak já už nevím, co jsem to zase vymyslel!
Alphard
Profil
Každý soubor s příponou .php musí vrátit jeden obrázek, určený v $_GET['path'].
honz@
Profil *
Já se fakt omlouvám, ale nešlo by to, prosím doplnit do toho kódu. Tady s tímhle jsem ještě nedělal. Za jakoukoli odpověď děkuji.
Alphard
Profil
honz@:
Skoro vše potřebné máte. Html img tagy vykreslí [#5], obrázky vytvoří [#3], tam zavolejte jen cropImage($_GET['path']);, možná bude potřeba upravit cestu, např. cropImage('images/'.$_GET['path']);
Ovšem podotýkám, že by bylo rozumné použít cache, takhle se budou pořád ořezávat obrázky při každém načtení stránky.
honz@
Profil *
Ano díky moc, vyzkouším.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0