Práca s obrázkami v PHP: zmena veľkostí obrázkov

Jakub Žilinčan  /  17. 07. 2007, 00:00

Po vysvetlení základných PHP funkcií si dnes ukážeme ďalšie, nemenej dôležité. Tieto budú slúžiť na úpravu rozmerov existujúcich obrázkov.



Existuje niekoľko možností, ako zmenšovať, resp. zväčšovať obrázky. Medzi tie najdôležitejšie patrí zmena veľkostí bez/s pomerom a tzv. online zmenšovanie. Ich funkcie si vysvetlíme v priebehu tohto článku. Pripomínam, že všade budeme pracovať len s JPEG obrázkami.

Zmena veľkosti obrázku na určité rozmery s uložením
Použijeme funkciu Zmensi_uloz. Najprv si zadáme cestu k pôvodnému obrázku, s ktorým chceme pracovať, potom miesto uloženia, a nakoniec novú šírku a novú výšku.

Potom si pomocou funkcie getimagesize() zistíme pôvodné rozmery obrázku. Tá ich vráti do pola, preto pre jednoduchšiu prácu použijeme list(), čím si jednoznačne definujeme, čo je šírka a čo výška.
Vytvoríme si truecolor obrázok s novo zadanými rozmermi, a napokon vytvoríme GD instanciu pre knižnicu z existujúceho JPEG obrázku.

Potom použijeme funkciu imagecopyresampled (nový obrázok, pôvodný obrázok, ľavý horný roh os x, ľavý horný roh os y, pravý dolný roh os x, pravý dolný roh os y, nová šírka, nová výška, pôvodná šírka, pôvodná výška), ktorá z pôvodného obrázku vytvorí nový so zadanými rozmermi. Ak sa názov nového a pôvodného obrázku zhodujú, súbor sa prepíše.

Napokon už len uložíme obrázok pomocou imagejpeg().
V minulých dieloch sme používali imagepng(obrázok). Kebyže aj tu pracujeme s PNG obrázkami, použijeme imagepng(obrázok, kam uložiť, kvalita). Pracujeme však s JPEG, a preto použijeme imagejpeg(obrázok, kam uložiť, kvalita).

<?php
function Zmensi_uloz(
$subor, //cesta k souboru, ktory chcete zmensit
$KamUlozit, //cesta, kam zmenseny soubor ulozit
$NovaSirka, //maximalni sirka zmenseneho obrazku
$NovaVyska) //maximalni vyska zmenseneho obrazku
{ //zistime povodnu velkost obrazku
list($sirka, $vyska) = getimagesize($subor);

$image_p = imagecreatetruecolor($NovaSirka, $NovaVyska);
//otvorenie povodneho obrazku zo suboru
$image = imagecreatefromjpeg($subor);
//okopirujeme zmenseny obrazok do povodneho

imagecopyresampled($image_p, $image, 0, 0, 0, 0, $NovaSirka, $NovaVyska, $sirka, $vyska);

//a ulozime
imagejpeg($image_p, $KamUlozit, 100);
}
?>

 

Zmena veľkosti obrázku podľa pomeru s uložením
Funkcia Zmensi_uloz_s_pomerom() pracuje podobne, ako predošlá Zmensi_uloz(), ale namiesto toho, aby sme zadali priamo nové rozmery, šírku a výšku vyrátame podľa pomeru.
Ak by sme maximálnej šírke priradili nulu, tak by sa maximálna širka rovnala pôvodnej. To isté platí aj pre výšku.

Potom si porovnáme pomer pre šírku, pomer pre výšku a vyjadríme si ho pomocou čísla. Novú šírku a výšku získame tak, že predelíme pôvodné hodnoty týmto číslom. Možno to takto vyznieva komplikovane, ide však len o matematické opérácie.

Nakoniec už len použijeme známe funkcie imagecreatetruecolor(), imagecopyresampled() a uložíme pomocou imagejpeg().

<?php
function Zmensi_uloz_s_pomerom(
$subor, //cesta k souboru, ktory chcete zmensit
$KamUlozit, //cesta, kam zmenseny soubor ulozit
$MaxSirka, //maximalni sirka zmenseneho obrazku
$MaxVyska) //maximalni vyska zmenseneho obrazku
{ //povodna velkost obrazku
list($sirka, $vyska) = getimagesize($subor);
//hodnota 0 v parametroch MaxWidth resp. MaxHeight znamena,
//ze sirka resp. vyska vysledku moze byt lubovolna
if ($MaxSirka == 0){ $MaxSirka = $sirka;}
if ($MaxVyska == 0){ $MaxVyska = $vyska;}
//vyratame pomer
$pomer_sirka = $sirka / $MaxSirka; //pomer sirka
$pomer_vyska = $vyska / $MaxVyska; //pomer vyska
if ($pomer_sirka > $pomer_vyska)
{ $pomer = $pomer_sirka;}
else
{ $pomer = $pomer_vyska;}
if ($pomer < 1) {$pomer = 1;}
//v pomer mame pomer pre zmensenie
//vypocitame vysku a sirku zmenseneho obrazku

$NovaSirka = (int)$sirka / $pomer;
$NovaVyska = (int)$vyska / $pomer;

//vytvorime novy obrazok pozadovanej vysky a sirky
$image_p = imagecreatetruecolor($NovaSirka, $NovaVyska);
$image = imagecreatefromjpeg($subor);
//a okopirujeme zmenseny povodny obrazok do noveho
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $NovaSirka, $NovaVyska, $sirka, $vyska);
//a ulozime
imagejpeg($image_p, $KamUlozit, 100);
}
?>

 

"Online" zmena veľkostí obrázku
Túto funkciu využijeme, keď chceme vytvárať zmenšené náhľady už uložených obrázkov. Toto nám ušetrí traffic a zmenšené obrázky budú mať oveľa lepšiu kvalitu, ako keby sme ich zmenšovali pomocou CSS.

Najlepšie je, keď si vytvoríme súbor "resize.php" a odkaz na obrázok bude potom v tvare:
<img src="resize.php?obrazok=obr.jpg&amp;sirka=200&amp;vyska=150"/>

Súbor resize.php bude potom obsahovať funkciu onlineresize(), ktorá obrázok zmenší a hneď zobrazí. Rátame s tým, že šírku budeme zadávať vždy. Málokedy sa obrázky upravujú na výšku, a teda si môžeme dovoliť zadať nulu do tejto hodnoty.

Ak sa tu nula vyskytne, novú šírku vyrátame cez pomer. Nakoniec už len obrázok zobrazíme a na konci zavoláme funkciu onlineresize(). Je treba mať na pamäti, že keď už raz použijeme hlavičku so zobrazením obrázku, nemôžeme pridávať ostatné HTML tagy. Potom by výstup vrátil chybu.

<?php
function onlineresize ($subor,$NovaSirka,$NovaVyska) {
$image = imagecreatefromjpeg($subor);

$sirka = imagesx($image);
$vyska = imagesy($image);

if ($NovaVyska==0){
$pomer=$sirka/$vyska;
$NovaVyska=$NovaSirka/$pomer;
}else {
$NovaSirka=$NovaSirka;
$NovaVyska=$NovaVyska;
}

$image_zmenseny = imagecreatetruecolor($NovaSirka, $NovaVyska);
imagecopyresampled($image_zmenseny, $image, 0, 0, 0, 0, $NovaSirka, $NovaVyska, $sirka, $vyska);

// Zobrazíme zmenšeninu
header('Content-type: image/jpeg');
imagejpeg($image_zmenseny);
}
//zavolame funkciu a zobrazime obrazok
onlineresize($_GET['obrazok'],$_GET['sirka'],$_GET['vyska']);
?>

 

To je asi tak všetko hlavné, čo potrebujeme pre prácu s veľkosťami obrázkov. Akurát upozornenie: obrázky musia byť nahrané v zapisovateľom adresári, a vo formáte JPEG.
Nabudúce sa ešte trošku pohráme s obrázkami, a to pridávaním watermarkov.

Neprehliadnite: